用sed替换多个特定的事件

牙膏

我有具有当前结构的大型CSV文件

380670000001,<n>,0,1970-01-01 00:00:00.00+0000,0,0,<n>,0,0

我必须将第二和第四列中的“ <n>”替换“ 1970-01-01 00:00:00.00 + 0000”
,并将其他列中的“ <n>”替换0

目前,我正在使用awk脚本:

awk 'BEGIN{FS=OFS=","}{sub("<n>","1970-01-01 00:00:00.00+0000",$2); sub("<n>","1970-01-01 00:00:00.00+0000",$4);  gsub("<n>", 0); print}' input.txt > output.txt

可以用sed做得更优雅吗?

卡西莫多

我不这么认为。在sed中,没有诸如字段之类的东西,因此您将不得不对正则表达式进行硬计数。可以做到,但不能优雅地做到这一点:

r='1970-01-01 00:00:00.00+0000'
sed -E "s/^([^,]*,)<n>/\1$r/;s/^(([^,]*,){3})<n>/\1$r/;s/<n>/0/g" file

如果您不知道反向引用,则可能想看看使用\ 1保留模式的一部分。)

可以通过设置外壳变量来对Awk进行清理,就像我上面对sed所做的那样,然后将其传递给awk。因此,您的awk脚本现在几乎只包含逻辑:

r='1970-01-01 00:00:00.00+0000'
m='<n>'
awk 'BEGIN{FS=OFS=","}{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' r="$r" m="$m" file

短一点:

awk -F, '{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' OFS=, r="$r" m="$m" file

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章