使用sed编写shell脚本

时间:2013-03-20 04:51:41

标签: shell

所以,我想从stdin读取文件,删除包含正好3'/'的所有'/',并将输出写入stdout。所以文件包含:

/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'

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

3 个答案:

答案 0 :(得分:2)

sed解决方案:

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

如果Perl对你没问题:

perl -F/ -ape '$_=@F>3?join"",@F:join "/",@F;' file

答案 1 :(得分:0)

sed -e '/^[^\/]*\/[^\/]*\/[^\/]*\/[^\/]*$/ s%/%%g'

令人毛骨悚然的模式寻找行的开始,一个零或多个非斜杠的序列,后跟斜杠,更多非斜杠和第二个斜杠,更多非斜杠和第三个斜杠,更多非斜杠和行结束。在与之匹配的任何行上,全局替换斜杠。

还有其他方法可以编写正则表达式,但它们并不是很清晰。这几乎适用于sed的任何版本。那么这样:

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

它查找行的开头,3个单位(零或更多非斜线后跟斜线),零或多个非斜杠和行尾。

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

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

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

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

答案 2 :(得分:-1)

这在awk

中要简单得多
awk -F/ 'NF==4 { gsub("/","") } {print}' tmp.txt