使用 sed|awk 和组进行替换的正则表达式

Regex with substitutions using sed|awk and groups

我有这个输入文本

16789248,16789759,"AS24155 Asia Pacific Broadband Wireless Communications Inc"

我想要这段文字

"AS24155","Asia Pacific Broadband Wireless Communications Inc"

这个正则表达式匹配

 /(.*)(AS\d+)(\s)([^"]+).*/g

用这个替换 "",""

我必须处理 300k 行,如果我能够使用基于 linux 的命令行实用程序(如 sed 或 awk),那将是最好的...但是我一直没有匹配项或匹配项,即使正则表达式似乎在其他地方匹配。

我应该使用不同的东西吗?

sed -r 可以通过一些修改来处理它:[0-9] 而不是 \d<space> 而不是 \s。没有真正的理由来捕获第一部分和第三部分,所以我删除了这些组。

sed -r -e 's/.*(AS[0-9]+) ([^"]+).*/"",""/'

或者,如果你想精确匹配那些字符 类,使用 [[:digit:]] 代表 \d[[:space:]] 代表 \s:

sed -r -e 's/.*(AS[[:digit:]]+)[[:space:]]([^"]+).*/"",""/'

或者,您可以使用 csvtool,它比 sed 更适合解析 CSV 文件。

csvtool col 3 input.txt | while read number name; do
    printf '"%s","%s"\n' "$number" "$name"
done
sed 's/[^"]*"/"/;s[[:space:]]/","/'

根据你的样本,避免分组问题

sed 是最好的选择,但仅供参考,您可以在 GNU awk 中使用几乎完全相同的 RE 来完成这项工作:

$ awk 'match([=10=],/.*(AS[0-9]+)\s([^"]+).*/,a){printf "\"%s\",\"%s\"\n", a[1], a[2]}' file
"AS24155","Asia Pacific Broadband Wireless Communications Inc"

您的原始命令可能失败了,因为只有一些工具接受 \s 而不是 [[:space:]] 并且几乎 none 接受 \d 而不是 [[:digit:]] (或者[0-9]).