Я пытаюсь редактировать некоторый текстовый файл с помощью sed. В текстовом файле существует две строки, запускающиеся с a string
. Я хочу удалить только первый и сказать 3 строки после него. Как я могу сделать это с sed?
вход:
string
line1
line2
line3
####
other lines
####
string
line4
line5
line6
вывод:
###
other lines
###
string
line4
line5
line6
Я попробовал sed '/string/,+3d'
но это удаляет обоих string
s и 3 строки после них, которых я не хочу.
$ cat remlines.txt
sometext1
sometext2
sometext3
string
line1
line2
line3
####
other lines
####
string
line4
line5
line6
Получение номера строки для первого string
происшествие
$ startln=$(grep -nrm 1 "string" remlines.txt | cut -d : -f 1)
Используя sed
удалить диапазон строк, начинающий с string
и окончание string's line number + 3)
$ sed "$(($startln)),$(($startln+3))d" remlines.txt > newremlines.txt
$ cat newremlines.txt
sometext1
sometext2
sometext3
####
other lines
####
string
line4
line5
line6
Если Вы не должны абсолютно использовать sed
, вот некоторые альтернативы:
$ awk '{ if(/string/ && !a){a=1;getline;getline;getline;getline} print}' file
####
other lines
####
string
line4
line5
line6
Или Perl:
$ perl -ne 'if(/string/ && !$a){$a=1;readline;readline;readline; next} print' file
####
other lines
####
string
line4
line5
line6
Perl имеет преимущество, что это имеет то же -i
опция как sed
(на самом деле опция, порожденная в Perl и, была скопирована в sed
) для оперативного редактирования:
perl -i.bak -ne 'if(/string/ && !$a){$a=1;readline;readline;readline; next} print' file