Как добавить строки в зависимости от содержимого файла (sed) - PullRequest
0 голосов
/ 13 января 2019

У меня есть список файлов (в файле с именем 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 голосов
/ 13 января 2019

Я не думаю, что 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

И.Е.

$ 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 должна измениться.

...