Удаление строки и строк после него

Я пытаюсь редактировать некоторый текстовый файл с помощью sed. В текстовом файле существует две строки, запускающиеся с a string. Я хочу удалить только первый и сказать 3 строки после него. Как я могу сделать это с sed?

вход:

string
line1
line2
line3
####
other lines
####
string
line4
line5
line6

вывод:

###
other lines
###
string
line4
line5
line6

Я попробовал sed '/string/,+3d' но это удаляет обоих strings и 3 строки после них, которых я не хочу.

2
задан 6 April 2020 в 13:38

2 ответа

$ 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
2
ответ дан 7 April 2020 в 23:16

Если Вы не должны абсолютно использовать 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
2
ответ дан 7 April 2020 в 23:16

Другие вопросы по тегам:

Похожие вопросы: