我正在尝试编写一个脚本将 postgres CSV 转储转换为 Oracle csv 转储。又名,我试图用“Y”替换“true”,用“N”替换“false”。
所以我想要一个名为 to_oracle 的脚本,如下所示:
echo "false,false,false,true" | to_oracle
N,N,N,Y
这是我的尝试:
sed -E -e 's:(,|^)true(,|$):\1Y\2:g' -e 's:(,|^)false(,|$):\1N\2:g' "$@"
其逻辑是,CSV 文件中的字段以行首或逗号“,”开头,以行尾或逗号“,”结尾
这个脚本的问题是它贪婪地吸收逗号,因此每隔一个字段不起作用:
echo "false,false,false,true" | to_oracle
N,false,N,Y
现在我想我可以将它通过管道传输到脚本两次,这样就可以完成工作,但我想知道是否有更优雅的解决方案?
最佳答案
awk
版本:
echo "false,false,false,true" | awk -F, -v OFS=, '{for(i=1;i<=NF;i++) $i=$i=="true"?"Y":"N"}1'
N,N,N,Y
逐一测试字段,如果true
则使用Y
,否则使用N
如果您也想测试false
echo "false,false,false,true" | awk -F, -v OFS=, '{for(i=1;i<=NF;i++) $i=($i=="true"?"Y":($i=="false"?"N":"other"))}1'
N,N,N,Y
关于regex - unix sed 不会回溯来完成工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58720763/