SED在比赛之间更改文本而不会影响比赛

时间:2018-08-27 10:48:38

标签: bash sed

我有一些文字

#MATCH1
command 1
command 2
command 3
#MATCH2

sed -i '/MATCH1/,/MATCH2/' s/^/#/' <filename>

##MATCH1
#command 1
#command 2
#command 3
##MATCH2

我想要的是

#MATCH1
#command 1
#command 2
#command 3
#MATCH2

任何人都知道如何执行此操作吗?无需后处理输出

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用此sed来确保我们在行首没有#

sed '/MATCH1/,/MATCH2/ s/^[^#]/#&/' file

#MATCH1
#command 1
#command 2
#command 3
#MATCH2

请注意,这仅匹配给定关键字之间的非空行。或者,您可以使用以下sed

sed '/MATCH1/,/MATCH2/ { /^#/! s/^/#/; }' file

答案 1 :(得分:1)

sed用于s / old / new,仅此而已。对于其他任何事情,您都应该使用awk:

$ awk '/MATCH2/{f=0} f{$0="#" $0} /MATCH1/{f=1} 1' file
#MATCH1
#command 1
#command 2
#command 3
#MATCH2

这将在任何UNIX盒子上的任何shell中使用任何awk都可以工作,并且如果/当您要执行其他任何操作时,完全可以修改