regex - unix sed 不会回溯来完成工作

标签 regex sed

我正在尝试编写一个脚本将 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/

相关文章:

regex - 正则表达式,用于匹配文字字符串组合

mysql - 使用 LOCATE 和 SUBSTRING 从 MySQL 返回特定文本

java - Pattern.matches不起作用,而replaceAll起作用

regex - 如何 grep 和过滤日期和特定字段的日志

linux - 检查参数的具体值,如果不匹配则更改它

linux - 基于linux系统的一栏文字电影加一些文字?

bash - 使用 sed 或 awk 对输出数据进行分组

regex - 用于 C 风格注释的 ANTLR 词法分析器

regex - 使用来自 uri 的端口进行 nginx 代理重定向

bash - 了解 sed 命令语法和 sed 命令