使用 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]
).
我有这个输入文本
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]
).