gpt4 book ai didi

bash - awk中递归读取文件的方法

转载 作者:行者123 更新时间:2023-11-29 09:29:32 24 4
gpt4 key购买 nike

我有一堆使用 \input{filename.tex} 宏的 latex 文件(它的工作方式类似于来自 C#include >),我想解决它们,这样我就可以将它们全部输出到一个 .tex 文件(该文件必须粘贴到 \input{} 的位置> 宏,可以安全地假设每个文件仅被引用一次)。

例子:

tesis.tex:

My thesis.
\input{chapter1.tex}
More things
\input{chapter2.tex}

第 1 章.tex:

Chapter 1 content.

chapter2.tex:

Chapter 2 content.
\include{section2-2.tex}

section2-2.tex:

Section 1.

期望的结果应该是:

My thesis.
Chapter 1 content.
More things
Chapter 2 content.
Section 1.

如果只有一个 \input{foo.tex} 级别,我就可以用这个 AWK 程序解决这个问题:

/\\input\{.*\}/{
sub(/^[^{]*{/,"",$0)
sub(/}[^}]*$/,"",$0)
system("cat " $0)
next
}

{
print $0
}

有什么方法可以在 AWK 中递归读取文件吗?

(我愿意用任何其他语言来做,但posix最好)

谢谢!

最佳答案

这是 awk 中的一个解决方案,在该作业的递归函数中使用 getline。我假定 chapter2.tex:

Chapter 2 content.
\input{section2-2.tex}

代码:

$ cat program.awk
function recurse(file) { # the recursive function definition
while((getline line<file) >0) { # read parameter given file line by line
if(line~/^\\input/) { # if line starts with \input
gsub(/^.*{|}.*$/,"",line) # read the filename from inside {}
# print "FILE: " line # debug
recurse(line) # make the recursive function call
}
else print line # print records without \input
}
close(file) # after file processed close it
}
{ # main program used to just call recurse()
recurse(FILENAME) # called
exit # once called, exit
}

运行它:

$ awk -f program.awk tesis.tex
My thesis.
Chapter 1 content.
More things
Chapter 2 content.
Section 1.

解决方案要求 \input 位于记录的开头,上面没有任何其他数据。

关于bash - awk中递归读取文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43081779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com