У меня есть файл, как показано ниже
first line
second line
third line
forth line
Я хочу удалить строки после второй строки, но сохранить вторую строку. я пытался
sed -i '/second line/,$d' filename
но он удалит вторую строку. Как его модифицировать?
Я обычно предпочитаю использовать ed
вместо нестандартного sed -i
для редактирования файлов:
printf '%s\n' '3,$d' w | ed -s filename
удалит все от третьей строки до конца файла и сохранит изменения.
Или, если вы имеете в виду не буквальную третью строку файла, а первую после соответствующего регулярного выражения:
printf '%s\n' '/second line/+1,$d' w | ed -s filename
@byhuang1998 byhuang1998 Вы ориентируетесь на Windows, но у вас все в порядке с sed? Если вы можете установить это, вы можете установить ed. Однако вам лучше использовать powershell.
Выведите соответствующую строку и удалите все последующие строки до конца файла:
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: переключатели командной строки
@byhuang1998 byhuang1998 Re: Как удалить n строк после определенной строки - см. обновленный ответ.
Если вы хотите удалить из совпадения ^second line
до конца файла, вам нужно принудительно выйти с q
после совпадения, например.
sed '/^second line/q' file
(вы можете добавить -i
для редактирования на месте)
Пример использования/вывода
С вашими строками в file:
$ sed '/^second line/q' file
first line
second line
но у меня возник другой вопрос. Как я могу удалить n строк после определенной строки (также остаться строкой, которую я искал)
Хм, когда вы говорите n
строк, сколько вы имеете в виду? Этот ответ удаляет все после совпадающего шаблона. Вы хотите сопоставить шаблон, а затем удалить следующие 2 строки или около того?
на самом деле, я пишу сценарий оболочки в Windows, и этот сценарий работает для моих товарищей по работе. Так что лучше не устанавливать ed или что-то еще. Можете ли вы дать мне прямое решение?