2016-04-28 77 views
0

在一个巨大的文件,我有口号码,如查找和替换使用仅在字符串中号和第3号SED

"port": "7733", 
"port": "7734", 
"port": "7631", 
"port": "7833", 
"port": "7835", 
"port": "7335", 
"port": "9834", 

我只需要更换(仅第3号)3 5使用SED。预期的结果应该是像

"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

回答

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", 
0

如果数据包含然后使用awk你只能分割字段并添加20到它4个端口:

$ 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