我想在包含'start / usr / lib / sendmail“$ src_running”'的行中注释一个文件
$ grep /usr/lib/sendmail /tmp/tcpip
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"
$ grep /usr/lib/sendmail /tmp/tcpip
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
#start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"
sed无法搜索字符串,只能搜索regexps(请参阅Is it possible to escape regex metacharacters reliably with sed),所以最好使用类似awk的工具,当你想要匹配字符串时,它会理解字符串:
$ awk -v str='start /usr/lib/sendmail "$src_running"' 'index($0,str){$0="#"$0} 1' file
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
#start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"
sed命令也适用于此。这是一个示例解决方案:
sed -r 's|start /usr/lib/sendmail "\$src_running"|#&|' inputfile
一个解释:
-r
选项提供扩展的正则表达式,避免广泛引用。但是Linux是特定的,并且在其他sed版本中不太便携。
s
sed命令替换。
|
搜索模式标记和替换模式标记
qazxsw poi引用$,逃避$ regex行尾锚
\$
替换模式,#是注释前缀,&是匹配的搜索模式
希望这对你有用。
由于库存AIX sed和awk不提供就地编辑,你可以考虑#&
的前身,sed
它是可编写脚本的并且就地编辑文件,如果你喜欢这样的东西:
ed!
这会使用ed -s /tmp/tcpip << 'EOF'
/start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF
选项调用/ tmp / tcpip上的ed
,这会禁止读取和写入的字节数的正常报告。然后它发送一个引用的-s
文件,其中包含一个命令列表。我在这里引用了一个文档,以防止对变量进行任何无意的解释,例如ed
。
这里唯一有趣的$src_running
命令是第一个;它的目的是找到我们追求的线,然后将其评论出来。最后两行只是ed
rite文件回到磁盘和w
uit编辑。主命令分为两部分:
q
指定,和/start \/usr\/lib\/sendmail "$src_running"/
搜索范围看起来有点滑稽,因为正斜杠是分隔符,所以我们需要转义作为搜索文本一部分的正斜杠。搜索和替换只是说用哈希标记和空格替换行的开头(特殊标记s/^/# /
)。
请注意,这直接回答了有关查找该文本(第一个)匹配项的问题;它不会替换所有匹配的行。如上所述,它也不关心该行当前是否被注释掉。两次评论该行并没有伤害任何东西,但如果你想更严格的搜索,你可以使用:
^
这里的区别在于我们需要将seach再次锚定到行的开头(ed -s /tmp/tcpip << 'EOF'
/^[^#]*start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF
),然后是零或更多(^
)字符,而不是*
(使用#
)。