sed 是否提供删除多个单独模式的功能,但不是全部?
例如:我有一个包含目录列表的文本文件,我需要从包含正好 4 个斜杠的行中删除 3 个斜杠,而不是 3,而不是 5-4。
前:
/foo/bar
/foo/bar/baz/quux
/boo/bar/baz
后:
/foo/bar
foobarbaz/quux
/boo/bar/baz
sed 是否提供删除多个单独模式的功能,但不是全部?
例如:我有一个包含目录列表的文本文件,我需要从包含正好 4 个斜杠的行中删除 3 个斜杠,而不是 3,而不是 5-4。
前:
/foo/bar
/foo/bar/baz/quux
/boo/bar/baz
后:
/foo/bar
foobarbaz/quux
/boo/bar/baz
使用起来更容易awk
:
$ awk -F/ 'NF==5{print $2$3$4"/"$5;next;}1' inputfile
/foo/bar
foobarbaz/quux
/boo/bar/baz
匹配任何只有 4 的行,并使用and/
对这些行执行替换:GNU sed
rev
% 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
这很粗糙,但很有效。更喜欢 awk 解决方案
sed 's:^/\([^/]\+\)/\([^/]\+\)/\([^/]\+\)\([^/]*/[^/]*\)$:\1\2\3\4:' file
/foo/bar
foobarbaz/quux
/foo/bar/baz/quux/dust
/boo/bar/baz