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