所以,我想从标准输入读取文件,删除所有包含 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'
但是,我不确定我需要在替换会话中添加什么。
所以,我想从标准输入读取文件,删除所有包含 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'
但是,我不确定我需要在替换会话中添加什么。
一个 sed 解决方案:
sed '/.*\/.*\/.*\//{s#/##g}' file
如果 Perl 适合您:
perl -F/ -ape '$_=@F>3?join"",@F:join "/",@F;' file
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%'
后者捕获四组“零个或多个非斜线”并将它们粘贴在一起以进行替换。你可以用非扩展的正则表达式来写,但它会比以前更多地使用反斜杠。
这在以下方面要简单得多awk
:
awk -F/ 'NF==4 { gsub("/","") } {print}' tmp.txt