删除一行及其后几行

删除一行及其后几行

我正在尝试使用 sed 编辑一些文本文件。文本文件中有两行以 开头string。我只想删除第一行并删除其后三行。如何使用 sed 做到这一点?

输入:

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

输出:

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

我已尝试过,sed '/string/,+3d'但是它会删除strings 和它们后面的 3 行,而我不想要这些。

答案1

如果您不是绝对需要使用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

$ 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

相关内容