Удалите все строки перед совпадением с sed

Я использую sed для фильтрации списка файлов. У меня есть отсортированный список папок, и я хочу получить все строки после определенного. Для выполнения этой задачи я использую описанное решение здесь, которое хорошо работает с любым вводом, который я пытался, но не работает, когда совпадение находится в первой строке. В этом случае sed удалит все строки ввода

Вот пример:

(ssh) [email protected] : ~
[0] % ls -1 /
bin
boot
...
sys
tmp
usr
var
vmlinuz

(ssh) [email protected] : ~
[0] % ls -1 / | sed '1,/tmp/d'
usr
var
vmlinuz

(ssh) [email protected] : ~
[0] % ls -1 / | sed '1,/^bin$/d'
# sed will delete all lines from the input stream

Как мне изменить команду, чтобы рассмотреть также предел, когда первая строка соответствует регулярному выражению?

BTW sed '1,1d' корректно работает и удаляет только первую строку.

Ответы

Ответ 1

попробуйте это (только для GNU):

sed '0,/^bin$/d'

.. вывод:

$sed '0,/^bin$/d' file
boot
...
sys
tmp
usr
var
vmlinuz

Ответ 2

Эта команда sed будет печатать все строки после и включать соответствующую строку:

sed -n '/^WHATEVER$/,$p'

Переключатель -n делает sed печать только тогда, когда сказано (команда p).

Если вы не хотите включать соответствующую строку, вы можете сказать sed удалить с начала файла в соответствующую строку:

sed '1,/^WHATEVER$/d'

(Мы используем команду d, которая удаляет строки.)

Ответ 3

вы также можете попробовать:

awk '/searchname/{p=1;next}{if(p){print}}'

Ответ 4

Я бы вставил тег перед совпадением и удалил в области видимости /start/,/####tag####/.