我有一个包含 95 个 tex 文件的文件夹。我需要创建一个包含以下代码的 tex 文件 all.tex:
\documentclass[10pt]{article}
\begin{document}
\input{file1.tex}
\input{file2.tex}
...
\input{file95.tex}
\end{document}
文件名是这样的不是有任何模式,因此我不能使用循环。以上只是一个工作示例。
我在 bash 上尝试了以下操作:
printf '%s\n' *.tex | paste -sd "\n" - > all.tex
这将创建一个如下所示的 all.tex 文件:
file1.tex
file2.tex
...
file95.tex
如何在文件名周围添加 \input{}?如何添加序言等?
我在用bash(在 Ubuntu 上)在 Windows 10 上。
答案1
在一个简单的 shell 脚本中,使用printf
简单的通配符扩展:
#!/bin/sh
printf '%s\n' '\documentclass[10pt]{article}' \
'\begin{document}'
printf '\input{%s}\n' *.tex
printf '%s\n' '\end{document}'
您可以调用该脚本并重定向输出,例如:
/path/to/script > /path/of/output.tex
在单个命令行上,您可以将打印分组在一起以进行单个重定向:
{ printf '%s\n' '\documentclass[10pt]{article}' \
'\begin{document}'
printf '\input{%s}\n' *.tex
printf '%s\n' '\end{document}'
} > /path/of/output.tex
答案2
可能不是最好的,但这是一个用于sed
编辑all.tex
文件的解决方案:
sed -e 's/^/\\input\{/g' -e 's/$/\}/g' all.tex
答案3
常规的 Ubuntu 默认安装了 perl,所以你可以这样做:
ls *tex | perl -pne 's/(.*)/\\input{$1}/' > allfiles.tex
可能是它还没有安装在 Windows 上的 Ubuntu 上,如果是这种情况apt-get install perl-base
就可以了。
编辑:如果 perl 不可用并且您不想安装它,您也可以使用 sed:
ls *tex | sed 's/\(.*tex\)/\\input{\1}/' > allfiles.tex
(但我总是推荐更强大的perl)
答案4
使用 GNU awk
:
awk '
BEGIN { print "\\documentclass[10pt]{article}"
print "\\begin{document}" }
BEGINFILE { printf("\\include{%s}\n", FILENAME); nextfile }
END { print "\\end{document}" }' *.tex
这将生成一个列表,如您所显示的列表,其中文件按照 shell 扩展文件名通配模式的顺序列出*.tex
。
file1.tex
对于通过 to命名的文件file95.tex
,这将不是按数字顺序。为此,您可能需要切换到 shellzsh
并使用file<1-95>.tex
globbing 模式或更宽松的模式*.tex(n)
。