Как удалить все до появления шаблона регулярного выражения на строку в переменной bash

Los archivos i18n/*son ​​solo para fines de localización, por lo que no son esenciales para la funcionalidad principal del programa. El resultado que ha publicado sugiere que ya tiene las cadenas en inglés.

Nota al margen #1 :No debería ejecutar rkhunter --updateya que es un riesgo de seguridad:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765895Instale rkhuntera través de apty deje que su administrador de paquetes se encargue de mantener la utilidad actualizada.

Nota al margen #2:rkhunterpuede generar muchos falsos positivos, así que prepárese para eso.

0
07.07.2019, 20:51
2 ответа

Вы правильно экранировали 1-ю скобку, но не вторую и не {}, которые также нужно экранировать. Кроме того, вы сопоставляете все до конца строки (.*$), что не нужно. Используя ваше регулярное выражение, это сделает то, что вы хотите:

$ sed 's/^.*\(\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\)/\1/' <<< "$var"
3.12.40.53 refunds@example.uk
6.77.11.44 data test@example
5.32.39.153    remix@example.com
5.113.30.37 dummy
9.109.22.6 hello@example.com
8.28.15.55 another

Но это еще сложнее, чем необходимо. Например, вам не нужен [\.], достаточно простого \.. И вы можете использовать флаг -E, чтобы включить расширенные регулярные выражения и упростить синтаксис до:

$ sed -E 's/^.*(([0-9]{1,3}\.){3}[0-9]{1,3})/\1/' <<< "$var"
3.12.40.53 refunds@example.uk
6.77.11.44 data test@example
5.32.39.153    remix@example.com
5.113.30.37 dummy
9.109.22.6 hello@example.com
8.28.15.55 another

Однако, , как указывает стилдрайвер , ваш интерлиньяж .*может потреблять больше, чем вы ожидаете, поэтому вместо этого было бы безопаснее сделать все на perl:

$ perl -pe 's/^.*?(([\d]{1,3}\.){3}\d{1,3})/\1/' <<< "$var"
43.12.40.53 refunds@example.uk
66.77.11.44 data test@example
55.32.39.153    remix@example.com
5.113.30.37 dummy
89.109.22.6 hello@example.com
68.28.15.55 68.28.15.55 another
1
28.01.2020, 02:22

Пара вопросов:

  1. вы смешиваете BRE и ERE (, например \(против (для группировки)

  2. ваш .*в конце должен быть внутри группы захвата, если вы хотите, чтобы результат включал все после IP

  3. ^.*в начале будет жадно потреблять столько символов, сколько сможет -включая все, кроме одной из первых цифр IP

Кроме того, .не нужно экранировать внутри []-, хотя это ничего не ломает.

Я не уверен, что это ПРАВИЛЬНЫЙ способ справиться с (3 )в sed, который (, в отличие от perl, говорит, что )не имеет не-жадного модификатора. Добавление слова -граничной привязки \bвроде бы работает, но кажется хрупким

Так что либо (BRE)

sed 's/^.*\(\b\([0-9]\{1,3\}[.]\)\{3\}[0-9]\{1,3\}.*$\)/\1/' <<< "$var"

или (ЭРЭ)

sed -E 's/^.*(\b([0-9]{1,3}[.]){3}[0-9]{1,3}.*$)/\1/' <<< "$var"
2
28.01.2020, 02:22

Теги

Похожие вопросы