#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 строк после определенной строки — см. Обновленный ответ.