【问题标题】:Replace a matching string from the end of line using sed使用 sed 从行尾替换匹配的字符串
【发布时间】:2017-05-17 21:46:58
【问题描述】:

我有一个文件内容,例如,

/var/lib/mlocate
/var/lib/dpkg/info/mlocate.conffiles
/var/lib/dpkg/info/mlocate.list
/var/lib/dpkg/info/mlocate.md5sums
/var/lib/dpkg/info/mlocate.postinst
/var/lib/dpkg/info/mlocate.postrm
/var/lib/dpkg/info/mlocate.prerm

在上面的文件内容中,我想使用下面的 sed 将每一行的最后一个斜杠(/)替换为空格

/var/lib mlocate
/var/lib/dpkg/info mlocate.conffiles
/var/lib/dpkg/info mlocate.list
/var/lib/dpkg/info mlocate.md5sums
/var/lib/dpkg/info mlocate.postinst
/var/lib/dpkg/info mlocate.postrm
/var/lib/dpkg/info mlocate.prerm

请帮帮我。

【问题讨论】:

    标签: sed


    【解决方案1】:
    sed 's|\(.*\)/|\1 |' file
    
    • sed 的正则表达式默认是贪婪,所以.*/ 匹配直到最后一个 / 实例的所有内容。

    • sed 默认使用 BRE(基本 正则表达式),其中可能令人惊讶的是,() 必须为 \ 转义才能包含捕获组(单独捕获封闭的子表达式)。

      • GNU (Linux) Sed 和 BSD/macOS Sed 支持非标准选项 -E 以启用 ERE(扩展正则表达式),在这种情况下您不需要转义括号:
        sed -E 's|(.*)/|\1 |' file # or -r with GNU Sed / non-macOS BSD Sed
    • 请注意如何选择正则表达式分隔符 | 而不是惯用的 /;使用| 允许未转义使用/ 作为文字来匹配。

    • 在替换部分中,\1 指的是第一个(也是唯一的)捕获组 (\(...\)) 匹配的内容,它是直到但不包括最后一个 / 的所有内容。通过在 \1 后面加上文字空格,您可以获得所需的结果。

    【讨论】:

      【解决方案2】:

      awk 版本:没有理由这样做。但它有效:)

      awk 'BEGIN{FS=OFS="/"} {$(NF-1)=$(NF-1) " " $NF; NF--} 1' inputfle
      /var/lib mlocate
      /var/lib/dpkg/info mlocate.conffiles
      /var/lib/dpkg/info mlocate.list
      /var/lib/dpkg/info mlocate.md5sums
      /var/lib/dpkg/info mlocate.postinst
      /var/lib/dpkg/info mlocate.postrm
      /var/lib/dpkg/info mlocate.prerm
      

      【讨论】:

        猜你喜欢
        • 2017-03-20
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 2016-04-29
        • 2011-06-30
        • 2021-03-01
        相关资源
        最近更新 更多