Заменить символы в строке соответствия

У меня есть текст с ip внутри него. Я хотел бы заменить каждую цифру в ip, за которой не следует «SpecialWord» с каким-то другим символом. В каждой строке может быть более одного ip.
Например:
Этот вход
*random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
Должно стать
*random text with different numbers* aaa.aa.aa.a *some more text* "SpecialWord" 32.123.21.44 *text again*
Я попытался использовать
sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/.../g'
но я не знаю, что точное число цифр в ip и sed не может выглядеть обычным. Что может мне помочь?

2 Solutions collect form web for “Заменить символы в строке соответствия”

Я не уверен, что regexp может запомнить длину шаблона, поэтому для чистого (частичного) решения sed:

Редактировать :

это было немного сложнее.

Я придумал файл sed a.sed

 p s/[0-9]\.[0-9]/aa/g s/with/phase 1/ p s/[0-9]a\.a/aa.a/g s/a\.a[0-9]/a.aa/g s/phase 1/phase 2/ p s/[0-9]aa.a/aaa.a/g s/a.aa[0-9]/a.aaa/g s/phase 2/final/ 

это в основном делает то же самое, что и в командной строке, но с линией отладки.

  • первая строка (- первая строка превратит 1.2 в aa (учтите, что цифра в тексте, например 1.12% будет равна a.a2% )
  • следующие строки складываются для двух и трехзначных IP-адресов.) превратите 1.2 в aa (обратите внимание, что цифра в тексте, например 1.12% будет равна a.a2% )
  • следующие строки строятся для двух и трехзначных IP-адресов.
  • удалить строку с p и s/phase x/../ когда OK

использование

 sed -f a.sed u 

где u (да, это не действительный IP-адрес, но это тоже не так)

 *random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again* *random text with different 12* 255.4.2.8 *some more text* "SpecialWord" 32.12.21.44 *text again* *random text with different 13* 255.453.263.788 *some more text* "SpecialWord" 2.123.21.454 *text again* *random text with different 1.12%* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again* *random text with different numbers* 5.43.23.8 *some more text* "SpecialWord" 32.3.1.44 *text again* 

это приведет к

 *random text final different numbers* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again* *random text final different 12* aaa.aaa *some more text* "SpecialWord" aa.aa.aa.aa *text again* *random text final different 13* aaa.aaa.aaa.aaa *some more text* "SpecialWord" a.aaa.aa.aaa *text again* *random text final different a.aa%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again* *random text final different numbers* a.aa.aa.a *some more text* "SpecialWord" aa.aaaa *text again* 

edit2 : если вы можете позволить себе временный файл

 grep -Eo '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' u > v 

получить список IP в v

 sed s/[0-9]/a/gv > w 

превратиться в анонимный IP в w

 paste -d '/' vw | sed -e 's|^.*$|s/&/|' 

генерировать файл sed, который превращает IP в анонимный IP …

 paste -d '/' vw | sed -e 's|^.*$|s/&/|' | sed -f - u 

… и применить к файлу.

результат такой же, как и выше, за исключением строки с 1.12%

 *random text with different 1.12%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again* 

это предположим, что у вас могут быть временные файлы, и, как правило, использовать крылатую ракету, чтобы убить кролика.

Замена IP-адресов безоговорочно может быть выполнена с помощью:

 perl -pe 's!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge' 

Объяснение: заменить IP-адреса результатом (заменить цифры на «a»)

Чтобы защитить IP-адреса после «SpecialWord», отметьте IP-адрес «#» (и удалите его в конце)

 perl -pe 's/"SpecialWord"\s*\d+/$&#/; ..... s/#//' 

Все вместе:

 perl -pe 's/"SpecialWord"\s*\d+/$&#/; s!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge; s/#//' file 
  • Сценарий оболочки, использующий функцию (), не находящую команду
  • История в оболочке Almquist в NetBSD
  • Уменьшить резервный файл журнала
  • Как получить несколько строк из файла с помощью регулярных выражений?
  • Удалите несколько последовательных имен файлов, но игнорируйте часть первого
  • Правильное место для установки командной строки (PS1) при использовании sh / bash / zsh вместе
  • Объедините две команды в .bash_profile
  • Запись символа N раз с помощью команды printf
  • Как форматировать десятичное число, чтобы отображать прецизионные ноль, но не конечные?
  • расширение командной строки переименования команд
  • Почему ядро ​​убивает мой процесс с отключением при выходе из системы?
  • Относительно отдельного файла в несколько файлов в соответствии с разделом строк
  • Linux и Unix - лучшая ОС в мире.