Обычно я начинаю с grep, чтобы получить правильное регулярное выражение.
# [multiple failed attempts here]
grep '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' file # good?
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file # good enough
Тогда я бы попытался преобразовать его в sed
, чтобы отфильтровать остальную часть строки. (Прочитав эту ветку, мы с тобой больше не будем этого делать: вместо этого мы будем использовать grep -o
)
sed -ne 's/.*\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\).*/\1/p # FAIL
Именно тогда меня обычно раздражает sed
за то, что я не использую те же регулярные выражения, что и остальные. Поэтому я перехожу на perl
.
$ perl -nle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&'
Perl приятно знать в любом случае. Если у вас установлен небольшой CPAN, вы даже можете сделать его более надежным при небольших затратах:
$ perl -MRegexp::Common=net -nE '/$RE{net}{IPV4}/ and say $&' file(s)