С любым 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 в пространстве шаблонов. Это будет проблема с огромными файлами, когда первый и второй находятся далеко друг от друга.
Используйте printf
с включенным описателем формата, чтобы напечатать строку с новым символом строки -. Также всегда безопасно указывать переменные в сценарии оболочки, если у вас нет веской причины этого не делать.
Также включите параметр nullglob
, чтобы игнорировать совпадения -расширенных глобусов
shopt -s nullglob
printf '%s\n' /usr/**/log
Использованиеfind
:
find /usr -name log
Это был бы портативный способ найти пути ко всем записям с именем log
где-либо в каталоге /usr
или под ним. Чтобы ограничиться только обычными файлами, добавьте-type f
:
find /usr -type f -name log
echo
выводит все свои операнды в одну строку, разделяя их пробелом и разделяя в конце новой строкой. Вот почему вы не получаете многострочный вывод -из своей первой команды.