【发布时间】:2026-02-19 12:50:01
【问题描述】:
谁能解释如何使用 sed 删除所有字符,包括 CSV 文件中一行上的第二个逗号?
典型行的开头可能看起来像
1234567890,ABC/DEF,并且第一列中的数字数量不同,即随机顺序可能有 9 或 10 或 11 个单独的数字,第二列中的字母也可以是随机的。这种随机性和可变长度使得无法使用任何显式模式搜索。
【问题讨论】:
标签: sed
谁能解释如何使用 sed 删除所有字符,包括 CSV 文件中一行上的第二个逗号?
典型行的开头可能看起来像
1234567890,ABC/DEF,并且第一列中的数字数量不同,即随机顺序可能有 9 或 10 或 11 个单独的数字,第二列中的字母也可以是随机的。这种随机性和可变长度使得无法使用任何显式模式搜索。
【问题讨论】:
标签: sed
你可以像这样用 sed 做到这一点
sed -e 's/^\([^,]*,\)\{2\}//'
不是 100% 确定语法,我试过了,但它似乎可以工作。它将删除零个或多个除逗号外的任何内容,后跟一个逗号,并且所有内容都连续匹配两次。
但更简单的方法是使用 cut,像这样
cut -d, -f3-
它将使用逗号作为分隔符,并打印字段 3 及以上。
编辑:
只是为了记录,sed和cut都可以将文件作为参数使用,只需将其附加在末尾即可
cut -d, -f3- myfile.txt
或者您可以通过它们管道输出程序的输出
./myprogram | cut -d, -f3-
【讨论】:
sed,您可以使用 sed -r 's/^([^,]*,){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
【讨论】:
感谢所有回复 - 在提供的帮助下,我编写了下面的简单可执行脚本,它可以满足我的需求。
#!/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
【讨论】: