【问题标题】:Find a line containing a UNIX path and comment it from a file查找包含 UNIX 路径的行并从文件中对其进行注释
【发布时间】:2019-08-16 00:34:57
【问题描述】:

我想在文件中注释包含 '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 命令通常用于此目的。 SE网络上有很多解决此问题的答案,也许其中一个可以帮助您。 stackexchange.com/search?q=comment+out+line+sed
  • 谢谢,我仍在寻找/试图弄清楚,我知道让这种命令在 AIX 上工作有点困难

标签: sed aix


【解决方案1】:

由于现有的 AIX sed 和 awk 不提供就地编辑,您可以考虑 sed 的前身 ed! 如果您喜欢这种东西,它可以编写脚本并就地编辑文件:

ed -s /tmp/tcpip << 'EOF'
/start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF

这会使用 -s 选项在 /tmp/tcpip 上调用 ed,这会抑制读取和写入字节数的正常报告。然后它向ed 发送一个引用 here-document,其中包含命令列表。我做了一个引用的here-document,以防止对变量的任何无意解释,例如$src_running

这里唯一有趣的ed 命令是第一个;它的目的是找到我们之后的行,然后将其注释掉。最后两行只是write 文件回磁盘和quit 编辑。主要命令分为两部分:

  • 地址,由搜索范围/start \/usr\/lib\/sendmail "$src_running"/ 指定,并且
  • 动作,即搜索和替换s/^/# /

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

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

ed -s /tmp/tcpip << 'EOF'
/^[^#]*start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF

这里的区别是我们需要再次将搜索锚定到行首 (​​^),然后是零个或多个 (*) 字符,它们是 not #(与[^#])。

【讨论】:

    【解决方案2】:

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

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

    解释:

    -r 选项提供扩展正则表达式,避免大量引用。但它是 Linux 特定的,并且在其他 sed 版本中的可移植性较差。

    ssed 命令进行替换。

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

    \$ 引用 $,转义 $ 正则表达式行尾锚

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

    希望这对你有用。

    【讨论】:

    • 感谢 @Ed 提供的优秀 cmets。我相应地修正了答案。
    【解决方案3】:

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

    【讨论】:

    • 非常感谢,这行得通。我会将输出重定向到另一个文件,并用“注释”输出覆盖原始文件。
    • 对,如果你使用 GNU awk,你可以使用 -i inplace
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2019-03-10
    • 2016-12-21
    • 2015-09-10
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多