Bash SED在不影响匹配的情况下更改匹配之间的文本

Bash SED在不影响匹配的情况下更改匹配之间的文本,bash,sed,Bash,Sed,我有一些文字 #MATCH1 command 1 command 2 command 3 #MATCH2 sed -i '/MATCH1/,/MATCH2/' s/^/#/' <filename> 我想要的是 #MATCH1 #command 1 #command 2 #command 3 #MATCH2 有人知道怎么做吗?无需对输出进行后处理 谢谢您可以使用此sed,以确保我们在行首没有#: sed '/MATCH1/,/MATCH2/ s/^[^#]/#&/' fi

我有一些文字

#MATCH1
command 1
command 2
command 3
#MATCH2

sed -i '/MATCH1/,/MATCH2/' s/^/#/' <filename>
我想要的是

#MATCH1
#command 1
#command 2
#command 3
#MATCH2
有人知道怎么做吗?无需对输出进行后处理


谢谢

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

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

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

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

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都可以工作,并且如果/当您想做其他事情时,修改它是非常简单的。

这个“&”代表什么?
&
是regex完全匹配的反向引用。
sed '/MATCH1/,/MATCH2/ { /^#/! s/^/#/; }' file
$ awk '/MATCH2/{f=0} f{$0="#" $0} /MATCH1/{f=1} 1' file
#MATCH1
#command 1
#command 2
#command 3
#MATCH2