我需要删除行中第一个逗号后出现的任何字母
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
我做错了什么?
答案 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秒。