2016-04-28 2 views
0

В огромном файле у меня есть номера портов, какНайти и заменить только цифры и 3-го числа в строку, используя патч в

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

Я просто должны заменить (только третий номер) 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].

Пожалуйста, дайте мне знать, как мы можем достичь с помощью СЭД

ответ

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

Если вы данные содержат 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