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

时间:2017-05-17 13:16:39

标签: 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替换每行上的最后一个斜杠(/),如下所示

/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

请帮助我。

2 个答案:

答案 0 :(得分:1)

sed 's|\(.*\)/|\1 |' file
    默认情况下,
  • sed的正则表达式是贪心,因此.*/会匹配 last /以外的所有内容实例

  • 默认情况下,
  • sed使用BRE(基本正则表达式),其中()可能必须{{1} - 转义以封闭捕获组(分别捕获封闭的子表达式)。

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

  • 在替换部分中,/指的是第一个(也是唯一的)捕获组(\1)匹配的内容,这是最后一个{但不包括'的最后一个{{ 1}}。通过使用文字空格跟随\(...\),您将获得所需的结果。

答案 1 :(得分:0)

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