将所有.tex文件名写入文件夹中,每个文件名都在一个相同的包装器中

时间:2012-03-15 02:18:28

标签: vim

我有一个充满.tex文件的文件夹,我想将这些文件名写入文件,每个文件名都在一个相同的包装器中。

例如,假设我有一个包含三个.tex文件A.tex,B.tex和C.tex的文件夹,尽管文件名不遵循简单模式。这些.tex文件是表格,我想将它们包装起来以获取\begin{table} \input{A.tex} \end{table}等等。

我的第一个想法是可能有一个LaTeX解决方案,但是看看TeX SE,似乎可以在Vim中更好地处理(特别是第三个答案here)。或者这是Perl或其他一些脚本语言更好地处理的任务? (我对Perl知识有限,但这会激励我学习更多知识)。谢谢!

2 个答案:

答案 0 :(得分:2)

如果文件名不包含换行符,则问题可能出现 在Vim脚本中很容易解决:

:call append('.', map(split(glob('*.tex'), '\n'), '''\begin{table} \input{''.v:val.''} \end{table}'''))

:let fmt = '\begin{table} \input{%s} \end{table}'
:call append('.', map(split(glob('*.tex'), '\n'), 'printf(fmt, v:val)'))

上述命令使用glob()函数来收集文件名列表 匹配给定的通配符。生成的文件名集表示为 包含用换行符分隔的路径的字符串。使用 split()函数,字符串被分解为列表,由列表处理 map()函数根据所需的文本模板格式化文件名。 然后,此列表中的字符串将插入当前行的下方 append()功能。

在缓冲区中填充文件名列表的另一种方法是插入输出 系统目录列表命令通过:read!命令,

:r!ls *.tex

要根据需要格式化列表,请运行

:'[,']s/.*/\\begin{table} \\input{&} \\end{table}/
执行上一个命令后立即执行

答案 1 :(得分:1)

虽然vim脚本可以处理这个问题,但它在Bash中会更容易。

for file in *.tex; do
    echo "\\begin{table} \\input{$file} \\end{table}" >> tables.Tex
done

现在,这确实假设没有文件名具有必须为Tex转义的字符;如果他们这样做,你可以在vim(:%s/find/repl/g)或shell替换(${file//find/repl})内完成。