$ awk '/^\[/ { head = $0; next } head != "" { print head; head = "" } { print }' file [main] foo = bar [option] opt1 = opt2 opt3 = opt4 [tail] print = true
Эта
awk
программа сохраняет каждый найденный заголовок в переменнуюhead
и сразу же переходит к следующей строке ввода.Если строка является не строкой заголовка, и если переменная
head
что-то содержит, выводится заголовок. Затем выводится текущая строка.Это более или менее прямой перевод ответа Эда Гримма на
awk
.Более или менее прямой перевод на
sed
, где место хранения используется для хранения самого последнего заголовка, будет выглядеть так/^\[/ { h; # store header in hold space (overwriting) d; # delete pattern space, start next cycle } x; # swap with hold space /./ { p; s///g; }; # if non-empty, print and empty x; # swap with hold space
Или, как один -вкладыш,
$ sed -e '/^\[/{ h;d; }' -e 'x; /./{ p;s///g; }' -e x file [main] foo = bar [option] opt1 = opt2 opt3 = opt4 [tail] print = true
Альтернативный, но более короткий
sed
вариант, основанный на том факте, что в конце файла есть пустой раздел/заголовок:$ sed -n -e'/^\[/{ x;/\n/p;d; }' -e H file [main] foo = bar [option] opt1 = opt2 opt3 = opt4 [tail] print = true
При этом заголовок и другие строки, связанные с ним, сохраняются в области удержания. Когда новый заголовок найден, пространство хранения заменяется и для него выполняется проверка на наличие символа новой строки. Если он найден, он печатается. Другие строки просто добавляются к пробелу.
Как и
awk
, это будет выглядеть какawk '/^\[/ { if (sect ~ ORS) print sect; sect = $0; next } { sect = sect ORS $0 }' file
cat document.pdf | zathura -
Передает содержание из document.pdf
Затуре, который пытается передать его.
ls | zathura -
Если у вас есть только каталог document.pdf
и больше ничего, это передает Затуре строку document.pdf
, а не ее содержимое, поэтому Затура жалуется. Более того, если вы пытаетесь написать программу, которая включает в себя синтаксический анализ ls
, вы, скорее всего, делаете это неправильно.