所以,我想从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'
但是,我不确定我需要在替换会话中添加什么。
答案 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