0

所以,我想从标准输入读取文件,删除所有包含 3 个“/”的行中的“/”,并将输出写入标准输出。所以一个文件包含:

/a1/b/c
/a/b2
///
/a

将有输出:

a1bc
/a/b2

/a

我在想这样的事情:

sed -r 's/\/[^\/]*\/[^\/]*\/.*/"I not sure what do I need to put in here"/g'

但是,我不确定我需要在替换会话中添加什么。

4

3 回答 3

2

一个 sed 解决方案:

sed '/.*\/.*\/.*\//{s#/##g}' file

如果 Perl 适合您:

perl -F/ -ape '$_=@F>3?join"",@F:join "/",@F;' file
于 2013-03-20T05:02:05.830 回答
0
sed -e '/^[^\/]*\/[^\/]*\/[^\/]*\/[^\/]*$/ s%/%%g'

令人毛骨悚然的模式寻找行首,零个或多个非斜线后跟一个斜线,更多非斜线和第二个斜线,更多非斜线和第三个斜线,更多非斜线和行尾. 在任何与此匹配的行上,将斜杠替换为任何内容。

还有其他编写正则表达式的方法,但它们并不十分清晰。这几乎适用于任何版本的sed. 这也会:

sed -e '/^\([^\/]*\/\)\{3\}[^\/]*$/ s%/%%g'

它查找行首、3 个单位(零个或多个非斜线后跟一个斜线)、零个或多个非斜线和行尾。

如果您sed有扩展的正则表达式(sed例如 GNU),那么您可以获得一些符号上的便利。

sed -r -e '/^([^\/]*\/){3}[^\/]*$/ s%/%%g'

sed -r -e 's%^([^/]*)/([^/]*)/([^/]*)/([^/]*)$%\1\2\3\4%'

后者捕获四组“零个或多个非斜线”并将它们粘贴在一起以进行替换。你可以用非扩展的正则表达式来写,但它会比以前更多地使用反斜杠。

于 2013-03-20T05:23:31.447 回答
-1

这在以下方面要简单得多awk

awk -F/ 'NF==4 { gsub("/","") } {print}' tmp.txt
于 2013-03-20T12:49:06.910 回答