【问题标题】:Use sed to replace elements with another but only under a condition使用 sed 将元素替换为另一个元素,但仅在某个条件下
【发布时间】:2021-11-02 20:35:55
【问题描述】:

我有一个包含以下形式的行的文件:

产品、品牌、成本、评论、位置、评级

我想把分隔符“,”改成新字符“;”

我尝试过使用 sed 命令,例如 `sed 's/,/;/g' prod.txt 但它也改变了数据中的逗号(“评论”、“品牌”和其他列)!

我可以使用 csvkit,但它会帮助我使用更通用的基本工具,如 sed、tr、grep、cut 等,因为我稍后将不得不概括这个问题,而 csvkit 将没有用处

请注意,我的数据是字符串,每个值都封装在引号“之间。这可能有助于隔离需要更改的逗号

我在这方面很糟糕,非常感谢您的帮助

最好的,

【问题讨论】:

  • 改用csvkit中的csvformatcsvformat -D '|' prod.csv > output.psv
  • 谢谢肖恩,但是有没有使用 sed 的解决方案?
  • 最好使用理解格式的工具,而不是尝试使用正则表达式来破解某些东西。 sed 仅适用于最琐碎的 CSV;嵌入逗号、引号、换行符等的字段并非如此。
  • 好吧,我明白了,只是我有其他文件有同样的问题,但是是txt格式而不是csv
  • 我已编辑问题以使其更清晰

标签: shell unix


【解决方案1】:

如果您必须使用sed,那么这个适用于您的示例数据但可能不适用于现实生活数据的脆弱解决方案可能会有所帮助。?。

$ sed 's/,/|/;s/,/|/;s/,/|/;s/\(.*"\).\([^,]*\).\(.*\)/\1|\2|\3/' input_file
Computer| "Apple"| 500| "Can be fixed"| Berlin| 5

Computer| "Apple"| 670| "Can be fixed, need new screen"| Berlin| 3

Phone| "Samsung"| 670|"Touch is dead, Screen is dead"| Berlin| 1

TV| "Samsung"| 670|"Antenna dead, light issues"| Frankfurt| 2

【讨论】:

  • 对不起,它对我不起作用:/ 它取代了引号之间的 , 我也不必使用 sed,我可以使用通用的基本 unix 工具,如 grep、tr、cut 等'd just like to avoid specific csv tools like csvformat
【解决方案2】:

这可能对你有用(GNU sed):

sed -E ':a;s/^([^"]*("[^",]*")*[^"]*"[^,"]*),/\1\n/;ta;y/,\n/|,/' file

将双引号内的,'s 转换为换行符,然后将,'s 转换为|'s 和\n's 转换为,'s。

【讨论】:

    【解决方案3】:

    使用 POSIX awk 怎么样?

    awk -v FS= -v OFS= \
    '{
        for (c=0; c<NF; c++) {
            if ($c == "\"") {
                quoted = !quoted
            }
    
            if ($c == "," && !quoted) {
                $c = "|"
            }
        }
    
        print
    }'
    

    我已经多次使用这种方法作为快速而肮脏(且可移植)的 csv 解析器。

    它正在扫描每个字符,并跟踪它是在双引号之内还是之外。它相当慢,但它确实完成了工作。

    注意事项:

    • 如果引用的字符串还包含转义的双引号 (\"),则会失败,某些 csv 文件会出现这种情况(您的示例数据没有)。我认为这可以解决,但我还没有时间这样做。
    • 任何单引号、非成对引号(没有匹配的引号)也会破坏它。
    • 慢。

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2020-03-19
      • 2013-05-29
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2015-06-18
      • 2013-03-14
      • 2021-09-07
      相关资源
      最近更新 更多