使用sed替换行尾的匹配字符串

使用sed替换行尾的匹配字符串,sed,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 在上面的文件内容中,我想使

我有一个文件内容,比如

/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 's|\(.*\)/|\1 |' file
  • sed
    的正则表达式在默认情况下是贪婪的,因此
    */
    将所有内容匹配到最后一个
    /
    实例

  • sed
    默认情况下使用BRE(基本正则表达式),其中,
    必须是
    \
    转义的,才能包含捕获组(单独捕获所包含的子表达式)

    • GNU(Linux)Sed和BSD/macOS Sed支持非标准选项
      -E
      以启用ERE(扩展正则表达式),在这种情况下,不需要括号转义:
      sed-E的|(.*)/|\1 |'文件#或-r,带有GNU sed/非macOS BSD sed
  • 请注意如何选择正则表达式分隔符
    |
    ,而不是常规的
    /
    ;使用
    |
    允许不加限制地将
    /
    用作要匹配的文本

  • 在替换部件中,
    \1
    指的是第一个(也是唯一一个)捕获组(
    \(…\)
    )匹配的内容,这是最后一个
    //code>的全部内容,但不包括。通过在
    \1
    后面加上一个文本空格,可以得到所需的结果


    • awk
      version:没有理由使用此命令执行任务。但它是有效的:)

      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