Как заменить подстроку в большей строке, которая соответствует egrep? - PullRequest
0 голосов
/ 08 июня 2018

Как заменить / 32 на / 128 только для адресов IPv6, указанных ниже в тексте?

52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/32
2600:2000:2046:5800:3:db06:4200:23a1/32
2600:2000:2046:7800:3:db06:4200:23a1/32

желаемый результат:

52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/128
2600:2000:2046:5800:3:db06:4200:23a1/128
2600:2000:2046:7800:3:db06:4200:23a1/128

egrep '\:[0-9a-f]{1,4}/32' соответствует последним четыремшестнадцатеричный символ и / 32, но как мне сохранить те же четыре шестнадцатеричных символа, как они, но только изменить / 32 на / 128?

спасибо!

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете использовать следующее регулярное выражение:

^(([[:xdigit:]]{1,4}:){7}[[:xdigit:]]{1,4}\/)32$

demo

и встроить его в команду sed:

sed -E 's@^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\/)32$@\1128@g' 

, где опция -E используется для включения расширенного регулярного выражения, если вы не укажете эту опцию, вам придется экранировать (, и это неприятно.

  • Прописные буквы в вашем IPv6-адресе также будут учитываться!
  • ^, $ якоря используются для добавления ограничения к вашему регулярному выражению
  • @ используется в качестве разделителя в вашей команде поиска / замены, и замена является обратной ссылкой на IPv6, и вы добавляете 128 к нему, поскольку 32 не входит в группу, как если бы вы заменили его на 128

ВХОД:

52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/32
2600:2000:2046:5800:3:DB06:4200:23a1/32
2600:2000:2046:7800:3:dB06:4200:23a1/32

ВЫХОД:

52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/128
2600:2000:2046:5800:3:DB06:4200:23a1/128
2600:2000:2046:7800:3:dB06:4200:23a1/128

С awk Вы также можетедостичь аналогичного результата:

$ cat testip | awk -F'/' '/^([[:xdigit:]]{1,4}:){7}[[:xdigit:]]{1,4}\/32$/{print $1"/"128; next}1'
52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/128
2600:2000:2046:5800:3:db06:4200:23a1/128
2600:2000:2046:7800:3:db06:4200:23a1/128

, где вы используете в качестве разделителя полей / и аналогичное регулярное выражение, когда строка соответствует шаблону, вы печатаете 1-е поле (соответствующее части IPv6), за которым следует /128 затем вы переходите к следующей строке.По умолчанию вы печатаете строку.

0 голосов
/ 08 июня 2018

После awk может помочь здесь. (Согласно комментарию Эда изменено [0-9a-fA-F] на [[:xdigit:]] в решении)

awk -v value="128" 'match($0,/(([[:xdigit:]]){1,4}:){1,4}[0-9](:([[:xdigit:]]){1,4}){1,3}\//){$0=substr($0,RSTART,RLENGTH) value}1' Input_file

Я тестировал его в версии awk 4.1 на случай, если у вас старая версияон также использует awk --re-interval для вышеприведенного кода.

Теперь добавляем также не-лайнерную форму решения.

awk -v value="128" '
match($0,/(([[:xdigit:]]){1,4}:){1,4}[0-9](:([[:xdigit:]]){1,4}){1,3}\//){
  $0=substr($0,RSTART,RLENGTH) value
}
1
'  Input_file
0 голосов
/ 08 июня 2018
$ cat /tmp/ips
52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/32
2600:2000:2046:5800:3:db06:4200:23a1/32
2600:2000:2046:7800:3:db06:4200:23a1/32
$ cat /tmp/ips | sed 's%\(:[0-9a-f]\{1,4\}\)/32%\1/128%'
52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/128
2600:2000:2046:5800:3:db06:4200:23a1/128
2600:2000:2046:7800:3:db06:4200:23a1/128

Здесь приведено описание регулярного выражения: https://regex101.com/r/FDjUct/1 Обратите внимание, что в качестве разделителя вместо / используется %, чтобы избежать экранирования символов / в регулярном выражении.

В зависимости от того, с каким sed вы знакомы, может быть более понятно использовать:

$ cat /tmp/ips | sed '/:/s/32$/128/'
52.222.128.45/32
172.22.187.101/32
52.222.128.248/32
2600:2000:2046:2000:3:db06:4200:23a1/128
2600:2000:2046:5800:3:db06:4200:23a1/128
2600:2000:2046:7800:3:db06:4200:23a1/128

В приведенной выше команде используются sed адреса дляприменять только замену 32 на 128 только к строкам, которые содержат :.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...