如何用sed/awk在数组末尾数字与]前插入', 12'?
问题描述
我有一个大文件,内容如下:
[0, 1, 2, 3, 4, 5, 6, 8, 9, 10 ], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10 ], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10 ], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11],
需要更新整个文件,添加逗号(,)和数字12,使其变为如下格式:
[0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12],
手动修改不现实,想找简便的sed/awk命令实现。
我试过命令:
sed 's/]/, 12]/g' <path_to_the_file>
但得到不符合预期的结果:
[0, 1, 2, 3, 4, 5, 6, 8, 9, 10 , 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10 , 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10 , 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12], [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12],
这不是我想要的效果。
解决方案
用sed命令实现
通过分组匹配区分两种行的特征,精准完成替换:
sed -E 's/(11)([[:space:]]*)\]/\1, 12\2]/; s/(10)([[:space:]]*)\]/\1, 12\2]/' <path_to_the_file>
如果需要直接修改原文件(原地替换),加上-i参数:
sed -i -E 's/(11)([[:space:]]*)\]/\1, 12\2]/; s/(10)([[:space:]]*)\]/\1, 12\2]/' <path_to_the_file>
规则解释
- 第一个替换规则:匹配以
11加任意空格后接]的行,替换为11, 12加原有空格和],对应原本末尾是11的行。 - 第二个替换规则:匹配以
10加任意空格后接]的行,替换为10,加对应数量空格和12,再拼接原有空格与],保证格式对齐。
用awk命令实现
awk的方案更灵活,适合处理格式对齐需求:
awk '{ if ($NF == "11],") { sub(/11]/, "11, 12]") } else { sub(/10[[:space:]]*]/, "10, 12]") } print $0 }' <path_to_the_file>
要原地修改文件,可以先输出到临时文件再替换原文件:
awk '{ if ($NF == "11],") { sub(/11]/, "11, 12]") } else { sub(/10[[:space:]]*]/, "10, 12]") } print $0 > "temp_file" }' <path_to_the_file> && mv temp_file <path_to_the_file>
内容的提问来源于stack exchange,提问作者Suryadevara Sai Harsha
相关产品推荐
相关产品推荐

