как удалить все строки после определенной строки в оболочке?

#shell

#оболочка

Вопрос:

У меня есть файл, подобный приведенному ниже

 first line
second line
third line
forth line
 

Я хочу удалить строки после второй строки, но сохранить вторую строку. Я пробовал
sed -i '/second line/,$d' filename но это приведет к удалению второй строки. Как это изменить?

Ответ №1:

Если вы хотите удалить из сопоставления ^second line с концом файла, вы захотите принудительно завершить работу с q после сопоставления, например

 sed '/^second line/q' file
 

(вы можете добавить -i для редактирования на месте)

Пример использования / вывода

С вашими строками в file:

 $ sed '/^second line/q' file
first line
second line
 

Комментарии:

1. но у меня есть еще один вопрос. Как я могу удалить n строк после определенной строки (также остается строка, которую я искал)

2. Хм, когда ты говоришь n о линиях — сколько ты имеешь в виду? Этот ответ удаляет все после совпадающего шаблона. Вы хотите соответствовать шаблону, а затем удалить следующие 2 строки или около того?

Ответ №2:

Обычно я предпочитаю использовать ed нестандартные sed -i для редактирования файлов:

 printf '%sn' '3,$d' w | ed -s filename
 

удалит все, начиная с третьей строки и заканчивая концом файла, и сохранит изменения.

Или, если вы имеете в виду не буквальную третью строку файла, а первую после соответствующего регулярного выражения:

 printf '%sn' '/second line/ 1,$d' w | ed -s filename
 

Комментарии:

1. на самом деле, я пишу сценарий оболочки в Windows, и сценарий работает для моих коллег по работе. Так что лучше не устанавливать ed или что-то еще. Можете ли вы дать мне прямое решение?

2. @byhuang1998 Вы ориентируетесь на Windows, но вас устраивает sed? Если вы можете установить это, вы можете установить ed. Однако вам лучше использовать powershell.

Ответ №3:

Выведите соответствующую строку и удалите все последующие строки до конца файла:

 perl -i.bak -ne 'print and last if /second line/; print;' in_file
 

Выведите соответствующую строку и удалите N (здесь, N=2 ) последующие строки из файла:

 perl -i.bak -ne 'if ( /second line/ ) { <> and next for 1..2; } print;' in_file
 

Однострочник Perl использует эти флаги командной строки:
-e : Указывает Perl искать код в строке, а не в файле.
-n : Перебирайте входные данные по одной строке за раз, присваивая им значение $_ по умолчанию.
-i.bak : Редактировать входные файлы на месте (перезаписать входной файл). Перед перезаписью сохраните резервную копию исходного файла, добавив к его имени расширение .bak .

СМОТРИТЕ ТАКЖЕ:
perldoc perlrun : как запустить интерпретатор Perl: переключатели командной строки

Комментарии:

1. @byhuang1998 Re: Как я могу удалить n строк после определенной строки — см. Обновленный ответ.