我写了下面的sed以取消引用csv中的数字,

sed  -E 's|,"(-?[0-9]*.?[0-9]*)",|,\1,|g'

当我尝试以下表达式时,
echo '"a","1.2","1.77",'|sed  -E 's|,"(-?[0-9]*.?[0-9]*)",|,\1,|g'

结果就是这样

“a”,1.2,“1.77”,

尽管在替换第一列和最后一列中的数字时,此特定正则表达式存在问题。我在这里的确切担心是想知道是否有一种方法可以以滑动窗口方式进行sed工作?

最佳答案

在GNU sed中,您可以使用

sed -E ':a; s/(,|^)"(-?[0-9]*\.?[0-9]+)"(,|$)/\1\2\3/g; ta' <<< '"a","1.2","1.77",'
# => "a",1.2,1.77,

在FreeBSD的sed中,使用-e附加命令:
sed -E -e ':a' -e 's/(,|^)"(-?[0-9]*\.?[0-9]+)"(,|$)/\1\2\3/g' -e 'ta'

online sed demo

详细信息
  • :a-设置a标签
  • s/(,|^)"(-?[0-9]*\.?[0-9]+)"(,|$)/\1\2\3/g-查找与(,|^)"(-?[0-9]*\.?[0-9]+)"(,|$)模式匹配的所有匹配项
  • (,|^)-组1:逗号或字符串开头
  • "-双引号
  • (-?[0-9]*\.?[0-9]+)-组2:可选-,0+位数字,和可选十进制分隔符,1+位数
  • "-双引号
  • (,|$)-组3:逗号或字符串结尾
    并替换为组1,组2和组3值
  • ta-成功替换后跳转到a标签位置。

  • 请注意,模式中的文字点应转义,否则,它与任何字符匹配。

    关于regex - sed推拉窗更换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59501446/

    10-10 17:43
    查看更多