【问题标题】:sed script to delete all characters up to & including the 2nd comma on a linesed 脚本删除所有字符,包括一行中的第二个逗号
【发布时间】:2026-02-19 12:50:01
【问题描述】:

谁能解释如何使用 sed 删除所有字符,包括 CSV 文件中一行上的第二个逗号?

典型行的开头可能看起来像

1234567890,ABC/DEF,并且第一列中的数字数量不同,即随机顺序可能有 9 或 10 或 11 个单独的数字,第二列中的字母也可以是随机的。这种随机性和可变长度使得无法使用任何显式模式搜索。

【问题讨论】:

    标签: sed


    【解决方案1】:

    你可以像这样用 sed 做到这一点

    sed -e 's/^\([^,]*,\)\{2\}//'
    

    不是 100% 确定语法,我试过了,但它似乎可以工作。它将删除零个或多个除逗号外的任何内容,后跟一个逗号,并且所有内容都连续匹配两次。

    但更简单的方法是使用 cut,像这样

    cut -d, -f3-
    

    它将使用逗号作为分隔符,并打印字段 3 及以上。

    编辑:
    只是为了记录,sed和cut都可以将文件作为参数使用,只需将其附加在末尾即可

    cut -d, -f3- myfile.txt
    

    或者您可以通过它们管道输出程序的输出

    ./myprogram | cut -d, -f3-
    

    【讨论】:

    • 如果您使用的是 GNU sed,您可以使用 sed -r 's/^([^,]*,){2}//',这对眼睛来说更容易一些。
    • @Dennis Williamson:是的,posix regex 似乎从来没有真正用于人眼,除非在寻找固定字符串时...... :)
    【解决方案2】:

    sed 不是工具的“正确”选择(尽管可以这样做)。由于您拥有结构化数据,因此您可以使用字段/分隔符方法而不是创建复杂的正则表达式。

    你可以使用剪切

    $ cut -f3- -d"," file
    

    还是傻眼

    $ gawk -F"," '{$1=$2=""}1'  file
    $ gawk -F"," '{for(i=3;i<NF;i++) printf "%s,",$i; print $NF}'  file
    

    【讨论】:

      【解决方案3】:

      感谢所有回复 - 在提供的帮助下,我编写了下面的简单可执行脚本,它可以满足我的需求。

      #!/bin/bash
      cut -d, -f3- ~/Documents/forex_convert/input.csv |
      sed -e '1d' \
      -e 's/-/,/g' \
      -e 's/ /,/g' \
      -e 's/:/,/g' \
      -e 's/,D//g' > ~/Documents/forex_convert/converted_input
      
      exit
      

      【讨论】: