我正在尝试使用 sed 编辑一些文本文件。文本文件中有两行以 开头string
。我只想删除第一行并删除其后三行。如何使用 sed 做到这一点?
输入:
string
line1
line2
line3
####
other lines
####
string
line4
line5
line6
输出:
###
other lines
###
string
line4
line5
line6
我已尝试过,sed '/string/,+3d'
但是它会删除string
s 和它们后面的 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