繁体   English   中英

如何仅使用一个 sed 命令替换连续的符号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM