查找包含UNIX路径的行,并从文件中对其进行注释

时间:2019-03-25 17:26:29

标签: sed aix

我想在文件中注释包含'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}"

3 个答案:

答案 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 #(带有[^#])。