[英]How to replace consecutive symbols using only one sed command?
我有一个 simple.csv 文件,其中包含包含“t”值的行。 这是示例:
2ABC;t;t;t;tortuga;fault;t;t;bored
我想使用 sed 将它们替换为“1”。
如果我使sed "s/;t;/;1;/g"
我得到下一个结果:
2ABC;1;t;1;tortuga;fault;1;t;bored
如您所见,连续的 ';t;' 已被替换为一个。 是的,我可以替换所有';t;' by sed -e "s/;t;/;1;/g" -e "s/;t;/;1;/g"
但这很无聊。
如何通过一个 sed 命令进行替换?
如果有东西要替换,分支再次替换。
sed ': again; /;t;/{ s//;1;/; b again }'
总的来说,用 sed 解析 cvs 是粗略的。 考虑 awk。
awk -F';' -v OFS=';' '{ for(i=1;i<=NF;++i) if ($i=="t") $i=1 } 1'
Lookarounds 在这种情况下很有用:
$ s='t;2ABC;t;t;t;tortuga;fault;t;t;bored;t'
$ echo "$s" | perl -lpe 's/(?<![^;])t(?![^;])/1/g'
1;2ABC;1;1;1;tortuga;fault;1;1;bored;1
echo '2ABC;t;t;t;tortuga;fault;t;t;bored' |
— gawk
特定的解决方案
gawk -be '(ORS = RT)^;(NF = NF)' FS='^t$' OFS=1 RS=';'
— 交叉awk
解决方案
{m,g,n}awk 'gsub(FS, OFS, $;(NF = NF))^_' FS=';t;' OFS=';1;' RS=
2ABC;1;1;1;tortuga;fault;1;1;bored
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.