Bash 使用sed仅查找并替换字符串中的数字和第三个数字

Bash 使用sed仅查找并替换字符串中的数字和第三个数字,bash,sed,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"

在一个巨大的文件中,我有如下端口号

"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实现,sed允许您将与正则表达式匹配的文本保存为一个组,以便以后使用。此解决方案保存两组:
3
前的数字和
后的数字。因此,替换文本由第一组(表示为
\1
)和第二组(表示为
\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",

sed
允许您将与正则表达式匹配的文本保存为一个组,以便以后使用。此解决方案保存两组:
3
前的数字和
后的数字。因此,替换文本由第一组(表示为
\1
)和第二组(表示为
\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",

如果数据包含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

如果数据包含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