【问题标题】:sed back-reference not workingsed 反向引用不起作用
【发布时间】:2017-08-11 13:42:38
【问题描述】:

我需要处理曲线 CSV 的每一行,以仅删除那些以 10 个逗号开头的行的最后一列。我使用的 sed 命令是:

$ cat curves.csv
(...)
,,,,,,,,,,2017/10/18,20630.000000
,,,,,,,,,,2017/11/15,20595.000000
,usdSN,:usdSN,,,,8005,$,,2017/08/07,Settlement Date
,,,,,,,,,,2017/12/20,20575.000000
,,,,,,,,,,2018/01/17,20555.000000
,,,,,,,,,,2018/02/21,20535.000000
(...)
,,,,,,,,,,2018/12/21,20290.000000
,usdZS,:usdZS,,,,8007,$,,2017/08/07,Settlement Date
,,,,,,,,,,2017/08/16,2848.500000
(...)

$ sed  s/\(,,,,,,,,,,[0-9/]*\),[0-9.]*/\1/g  curves.csv

但是,它没有用。它打印出所有行不变。

请帮忙。

【问题讨论】:

  • sed s/(,,,,,,,,,,[0-9/]*),[0-9.]*/\1/g curve.csv

标签: sed


【解决方案1】:

使用 GNU sed 的另一种方法:

sed -r '/^,{10}/{s/,[^,]*$//}' file

输出:

(...) ,,,,,,,,,,2017/10/18 ,,,,,,,,,,2017/11/15 ,usdSN,:usdSN,,,,8005,$,,2017/08/07,结算日 ,,,,,,,,,,2017/12/20 ,,,,,,,,,,2018/01/17 ,,,,,,,,,,2018/02/21 (...) ,,,,,,,,,,2018/12/21 ,usdZS,:usdZS,,,,8007,$,,2017/08/07,结算日 ,,,,,,,,,,2017/08/16 (...)

【讨论】:

  • 优雅的解决方案。
【解决方案2】:

问题在于您运行 sed 的方式。你做到了:

sed  s/\(,,,,,,,,,,[0-9/]*\),[0-9.]*/\1/g  curves.csv

但是由于没有引用参数,shell 会解析转义字符,实际运行的是:

sed  s/(,,,,,,,,,,[0-9/]*),[0-9.]*/\1/g  curves.csv

这不匹配任何内容,因为您的文件中没有括号。你应该如何运行它:

sed 's/\(,,,,,,,,,,[0-9/]*\),[0-9.]*/\1/g' curves.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2021-12-15
    相关资源
    最近更新 更多