sed:仅删除特定模式的特定次数

时间:2013-09-20 14:11:08

标签: bash parsing command-line sed

sed是否提供了删除一些单独模式的功能,但不是全部?

例如:我有一个包含目录列表的文本文件,我需要从包含4个斜线的行中删除3个斜杠,而不是3个,而不是5 - 4个。

在:

/foo/bar
/foo/bar/baz/quux
/boo/bar/baz

后:

/foo/bar
foobarbaz/quux
/boo/bar/baz

3 个答案:

答案 0 :(得分:4)

使用awk

更容易
$ awk -F/ 'NF==5{print $2$3$4"/"$5;next;}1' inputfile
/foo/bar
foobarbaz/quux
/boo/bar/baz

答案 1 :(得分:2)

匹配任何只有4 /的行,并使用GNU sedrev对这些行执行替换:

% cat file
/1/2/3
/1/2/3/4
/1/2/3/4/5

% rev file | sed -r '\%(^[^/]+/){4}$%{s%/%%2g}' | rev
/1/2/3
123/4
/1/2/3/4/5

答案 2 :(得分:1)

这很粗糙但有效。更喜欢awk解决方案

sed  's:^/\([^/]\+\)/\([^/]\+\)/\([^/]\+\)\([^/]*/[^/]*\)$:\1\2\3\4:' file
/foo/bar
foobarbaz/quux
/foo/bar/baz/quux/dust
/boo/bar/baz