如何根据文件内容添加行(sed)

时间:2019-01-13 13:47:52

标签: sed makefile

我有一个文件列表(位于名为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

我定义了宏,这些宏将扩展到目录的合理行。

1 个答案:

答案 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命令进行重大更改。