我有一个像
这样的文件内容/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
请帮助我。
答案 0 :(得分:1)
sed 's|\(.*\)/|\1 |' file
sed
的正则表达式是贪心,因此.*/
会匹配 last /
以外的所有内容实例
sed
使用BRE(基本正则表达式),其中(
和)
可能必须{{1} - 转义以封闭捕获组(分别捕获封闭的子表达式)。
\
以启用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