Результаты печати в нескольких строках

С любым POSIX sed :

$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
  • После первого совпадения / hello / мы попадаем в цикл.

  • Внутренний цикл : 1 , мы читаем каждую N внешнюю строку в пространство шаблонов, выполняя команду s ubstitute для 2 nd только вхождение. Мы t оцениваем успешность замены. Если да, мы попадаем в цикл : 2 , иначе повторяем цикл с b1 .

  • Внутри цикла : 2 , мы просто печатаем оставшиеся строки до конца файла.

Обратите внимание, что этот подход будет хранить все, что находится между двумя hello в пространстве шаблонов. Это будет проблема с огромными файлами, когда первый и второй находятся далеко друг от друга.

-1
02.11.2018, 07:09
2 ответа

Используйте printfс включенным описателем формата, чтобы напечатать строку с новым символом строки -. Также всегда безопасно указывать переменные в сценарии оболочки, если у вас нет веской причины этого не делать.

Также включите параметр nullglob, чтобы игнорировать совпадения -расширенных глобусов

shopt -s nullglob
printf '%s\n' /usr/**/log
3
28.01.2020, 05:07

Использованиеfind:

find /usr -name log

Это был бы портативный способ найти пути ко всем записям с именем logгде-либо в каталоге /usrили под ним. Чтобы ограничиться только обычными файлами, добавьте-type f:

find /usr -type f -name log

echoвыводит все свои операнды в одну строку, разделяя их пробелом и разделяя в конце новой строкой. Вот почему вы не получаете многострочный вывод -из своей первой команды.

1
28.01.2020, 05:07

Теги

Похожие вопросы