
Как можно использовать sed
функцию для удаления строк, следующих за совпадением (или любого другого числа), но не включая само совпадение и строки между ними?
Например:
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
> mysecretword
Password accepted
Я хочу удалить только строку "> mysecretword" из-за того, что она находится на две строки после строки "Введите свой пароль в приглашении ниже". Я не могу использовать абсолютные позиции номеров строк, потому что совпадение может появиться через любое количество строк после начала файла.
Поискав в интернете, я нашел много решений, таких как sed '/Enter your password.*/,+3d' filex
, но это также удалило бы строку "Введите свой пароль..." и следующую строку, что не то, что мне нужно. Я хочу удалить только одну строку, которая представляет собой определенное количество строк после совпадения.
Как это можно сделать с помощью sed
(или любого другого общедоступного инструмента)?
решение1
Возможно
sed '/^Enter your password/ {
n
n
d
}' file
или эквивалентно:
$ sed '/^Enter your password/ {n;n;d;}' file
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
решение2
Для общих случаев см. этот превосходный ответ Эда Мортона:Печать строки с помощью sed или awk по соответствующему шаблону .
d) Вывести каждую запись, кроме N-й записи после некоторого регулярного выражения:
awk 'c&&!--c{next}/regexp/{c=N}1' file
Подача заявки на данный ввод
$ awk 'c && !--c{next} /^Enter your password/{c=2} 1' ip.txt
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
/^Enter your password/{c=2} 1
вотc
n-ная строка после совпадения, которую нужно проигнорировать,1
чтобы вывести входную записьc && !--c{next}
оператор&&
короткой схемы is, поэтому, покаc
он оценивается как false,c
не будет уменьшаться. После того, какc
is установлен в значение, он будет уменьшаться, пока не достигнет0
решение3
sed '/Enter your password.*/{N;p;N;d;}' file