使用sed查找和替换字符串中的数字和第3个数字

时间:2016-04-28 23:41:46

标签: bash sed

在一个巨大的文件中,我有像

这样的端口号
"port": "7733",
"port": "7734",
"port": "7631",
"port": "7833",
"port": "7835",
"port": "7335",
"port": "9834",

我只需要使用sed替换(仅第3个数字)3和5。预期的结果应该是

"port": "7753",
"port": "7754",
"port": "7651",
"port": "7853",
"port": "7855",
"port": "7355",
"port": "9854",

我试过了

sed -E 's/[0-9][0-9]3[0-9]+/[0-9][0-9]5[0-9]/g'

但这会将所有数字替换为[0-9] [0-9] 5 [0-9]。

请告诉我们如何使用sed实现

2 个答案:

答案 0 :(得分:0)

sed允许您将与正则表达式匹配的文本保存为稍后要使用的组。此解决方案可以保存两组:3之前的数字和之后的数字。因此,替换文本由第一组表示,\1,数字5,第二组表示\2。因此:

$ sed -E 's/([0-9][0-9])3([0-9]+)/\15\2/g' file
"port": "7753",
"port": "7754",
"port": "7651",
"port": "7853",
"port": "7855",
"port": "7355",
"port": "9854",

答案 1 :(得分:0)

如果您的数据包含4个数字端口,然后使用awk,您只需拆分字段并向其添加20:

$ awk 'BEGIN{FS=OFS="\""}{$4+=20}1' file
"port": "7753",
"port": "7754",
"port": "7651",
"port": "7853",
"port": "7855",
"port": "7355",
"port": "9854",

输出看起来不错后,您可以重定向到另一个文件。或者,如果您使用的是GNU awk v4.1或更高版本,则可以通过执行以下操作进行更改:

awk -i inplace 'BEGIN{FS=OFS="\""}{$4+=20}1' file