我有一个文件列表(位于名为inputlist
的文件中),该文件位于几个子目录中,类似于此:
\input ./bak/dir1/file1
\input ./bak/dir1/file2
\input ./bak/dir2/file1
\input ./bak/dir2/file2
\input ./bak/dir3/file1
\input ./bak/dir3/file2
在每次更改目录之前,我要添加一个\addcontentsline
行。例如,第一行应显示为:
\addcontentsline{toc}{section}{\dir1}
我尝试使用sed
提取子目录的名称,请参见下文。但是后来我无法将所有内容放在一起。
sed -e 's|.*./bak/\(.*\)/.*|\\\1|' inputlist
将返回\dir1
等的列表。
因此,我正在寻找一种makefile
解决方案,该解决方案将有助于将我的inputlist
转换为如下形式:
\addcontentsline{toc}{section}{\dir1}
\input ./bak/dir1/file1
\input ./bak/dir1/file2
\addcontentsline{toc}{section}{\dir2}
\input ./bak/dir2/file1
\input ./bak/dir2/file2
\addcontentsline{toc}{section}{\dir3}
\input ./bak/dir3/file1
\input ./bak/dir3/file2
我定义了宏,这些宏将扩展到目录的合理行。
答案 0 :(得分:0)
我认为sed
不适合这样做。
尝试awk
:
awk -F/ -v s='\\addcontentsline{toc}{section}{\\' '{if ($3!=dir) {if(dir) print s dir "}" ORS lines; dir=$3; lines=$0;} else lines=lines ORS $0}END{if(dir) print s dir "}" ORS lines}' inputlist
IE。
$ cat inputlist
\input ./bak/dir1/file1
\input ./bak/dir1/file2
\input ./bak/dir2/file1
\input ./bak/dir2/file2
\input ./bak/dir3/file1
\input ./bak/dir3/file2
$ awk -F/ -v s='\\addcontentsline{toc}{section}{\\' '{if ($3!=dir) {if(dir) print s dir "}" ORS lines; dir=$3; lines=$0;} else lines=lines ORS $0}END{if(dir) print s dir "}" ORS lines}' inputlist
\addcontentsline{toc}{section}{\dir1}
\input ./bak/dir1/file1
\input ./bak/dir1/file2
\addcontentsline{toc}{section}{\dir2}
\input ./bak/dir2/file1
\input ./bak/dir2/file2
\addcontentsline{toc}{section}{\dir3}
\input ./bak/dir3/file1
\input ./bak/dir3/file2
假设所有行都是这样,并且dir#
的位置是相对固定的。
如果这将更改,则需要对awk命令进行重大更改。