删除数字后和逗号之前的字母

时间:2017-04-05 13:34:15

标签: linux unix sed

我需要删除行中第一个逗号后出现的任何字母

some.file

JAN,334X,333B,337A,338D,332Q,335H,331U

预期结果:

JAN,334,333,337,338,332,335,331

代码:

sed -i 's/\[0-9][0-9][0-9].*,/[0-9][0-9][0-9],/g' some.file

我做错了什么?

6 个答案:

答案 0 :(得分:4)

你也可以使用一个小循环(这是GNU sed);

sed ':;s/[A-Z],/,/2;t;s/[A-Z]$//'

它只删除逗号前面的第二个字母,然后循环。最后,它删除了行尾的字母,如果有的话。

答案 1 :(得分:2)

有些问题是:

  • 无需逃避[

  • 您的replace值错误。例如:s/regex/replace/g

使用此:

sed -e 's/\([0-9]\+\)[a-zA-Z],/\1,/g' -e 's/\([0-9]\+\)[a-zA-Z]$/\1/g' file

答案 2 :(得分:2)

你应该省略*而第一\看起来像是一个错误,即

sed -i 's/[0-9][0-9][0-9].,/[0-9][0-9][0-9],/g' some.file

但我想你也想要捕捉数字......

sed -i 's/\([0-9][0-9][0-9]\).,/\1,/g' some.file

如果您发布实际输出也会有所帮助

答案 3 :(得分:2)

试试这个

$ sed 's/,\([0-9]*\)[^,]*/,\1/g' <<<'JAN,334X,333B,337A,338D,332Q,335H,331U'
JAN,334,333,337,338,332,335,331

您需要使用圆括号捕获数字,以便在替换中使用捕获的字符串。选项g会在每次出现时执行此操作。

不同答案的比较

测试数据:

$ > data; for ((x=1000000;x>0;x--)); do echo 'JAN,334X,333B,337A,338D,332Q,335H,331U' >> data; done

我的回答是最慢的:

$ time sed 's/,\([0-9]*\)[^,]*/,\1/g' < data >/dev/null

real    0m16.368s
user    0m16.296s
sys     0m0.024s

Michael有点快:

$ time sed ':;s/[A-Z],/,/2;t;s/[A-Z]$//' < data >/dev/null

real    0m9.669s
user    0m9.624s
sys     0m0.012s

但是Sundeep是紧固件:

$ time sed 's/[A-Z]//4g' < data >/dev/null

real    0m4.905s
user    0m4.856s
sys     0m0.028s

答案 4 :(得分:2)

由于问题被标记为linux,因此GNU sed选项会派上用场

$ echo 'JAN,334X,333B,337A,338D,332Q,335H,331U' | sed -E 's/[A-Z](,|$)/\1/2g'
JAN,334,333,337,338,332,335,331
  • 2g表示从第二场比赛开始直到比赛结束

如果第一列已知字母数,则可以简化为

$ echo 'JAN,334X,333B,337A,338D,332Q,335H,331U' | sed 's/[A-Z]//4g'
JAN,334,333,337,338,332,335,331

答案 5 :(得分:2)

不需要sed,coreutils会这样做:

paste -d, <(cut -d, -f1 data) <(cut -d, -f2- data | tr -d 'A-Z')

ceving's answer生成的数据文件上运行时,我的计算机上 .3秒