我想在文件中注释包含'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}"
答案 0 :(得分:1)
sed不能搜索字符串,只能搜索正则表达式(请参见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}"
答案 1 :(得分:0)
sed命令在这里也适用。 这是一个示例解决方案:
sed -r 's|start /usr/lib/sendmail "\$src_running"|#&|' inputfile
说明:
-r
选项提供了扩展的正则表达式,避免了广泛的引用。但是它是Linux特定的,并且在其他sed版本中不那么可移植。
s
sed替换命令。
|
搜索模式标记和替换模式标记
\$
用$引号,使$ regexp换行符结束
#&
替换模式,#是评论前缀,&是匹配的搜索模式
希望这对您有用。
答案 2 :(得分:0)
由于库存的AIX sed和awk不提供就地编辑,因此,您可以考虑使用sed
的前身ed!,它是可编写脚本的,并且可以就地编辑文件,如果您喜欢这样的话:
ed -s /tmp/tcpip << 'EOF'
/start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF
这会使用ed
选项在/ tmp / tcpip上调用-s
,从而禁止显示常规报告的读写字节数。然后,它向ed
发送包含命令列表的带引号的这里文档。我在此处引用了一个文档,以防止对变量进行任何无意的解释,例如$src_running
。
这里唯一有趣的ed
命令是第一个;其目的是找到我们要关注的行,然后将其注释掉。最后两行只需w
将文件写入磁盘并q
进行编辑。主要命令分为两部分:
/start \/usr\/lib\/sendmail "$src_running"/
指定的地址,和s/^/# /
搜索范围看起来有些有趣,因为正斜杠是分隔符,因此我们需要转义属于搜索文本的正斜杠。搜索和替换只是说要用井号和空格替换行首(特殊标记^
)。
请注意,这直接回答了您关于查找该文本的 the (第一个)匹配项的问题;它不会替换匹配行的 all 。如上所述,它也不关心当前是否已注释掉该行。两次注释该行不会对您造成任何伤害,但是如果您想更严格地进行搜索,可以使用:
ed -s /tmp/tcpip << 'EOF'
/^[^#]*start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF
此处的区别在于,我们需要再次将seach锚定到行的开头(^
),然后再跟随零个或多个(*
)字符,这些字符是< em> not #
(带有[^#]
)。