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

问题描述 投票:2回答:3

我想在包含'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 aix
3个回答
1
投票

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}"

0
投票

sed命令也适用于此。这是一个示例解决方案:

sed -r 's|start /usr/lib/sendmail "\$src_running"|#&|' inputfile

一个解释:

-r选项提供扩展的正则表达式,避免广泛引用。但是Linux是特定的,并且在其他sed版本中不太便携。

s sed命令替换。

|搜索模式标记和替换模式标记

qazxsw poi引用$,逃避$ regex行尾锚

\$替换模式,#是注释前缀,&是匹配的搜索模式

希望这对你有用。


0
投票

由于库存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命令是第一个;它的目的是找到我们追求的线,然后将其评论出来。最后两行只是edrite文件回到磁盘和wuit编辑。主命令分为两部分:

  • 地址,由搜索范围q指定,和
  • 行动,这是搜索和替换/start \/usr\/lib\/sendmail "$src_running"/

搜索范围看起来有点滑稽,因为正斜杠是分隔符,所以我们需要转义作为搜索文本一部分的正斜杠。搜索和替换只是说用哈希标记和空格替换行的开头(特殊标记s/^/# /)。

请注意,这直接回答了有关查找该文本(第一个)匹配项的问题;它不会替换所有匹配的行。如上所述,它也不关心该行当前是否被注释掉。两次评论该行并没有伤害任何东西,但如果你想更严格的搜索,你可以使用:

^

这里的区别在于我们需要将seach再次锚定到行的开头(ed -s /tmp/tcpip << 'EOF' /^[^#]*start \/usr\/lib\/sendmail "$src_running"/s/^/# / w q EOF ),然后是零或更多(^)字符,而不是*(使用#)。

© www.soinside.com 2019 - 2024. All rights reserved.