LinuxForum.Fans
Тема

PERL: regexp - как заэкранировать "точку"

Автор: deleted_user 6 сообщений 2637 просмотров
#102302

Товарищи, есть практический вопрос. Что-то то ли я документацию не осилил, то ли там такого и не было...

Сабж (рабочий код):

text
#!/usr/bin/perl

my $rule = "-A INPUT -s 192.168.0.2/32 -j ACCEPT"; #1

$rule =~ s/\./p/g; #3 $rule =~ /(\w+)(?=\/32)/; #2 my $ip = $1; $ip =~ s/p/\./g; #4

print("$ip\n");

exit 0;

Идея - анализировать правило iptables с целью извлечения из него ip адреса.
Правило назначается на отметке #1. Айпишник должен забираться с помощью строчки с отметкой #2. Суть - забирать слово, стоящее перед фрагментом "/32", т.е. требуемый ip. Но забирается только последний октет адреса, т.к. оный содержит знак "точка". Чтобы обойти это, были добавлены костыли #3 и #4.
Не красиво.

Товарищи, не подскажите, как это сделать в одно выражение? Чтобы не делать замены и т.д.? Возможно ли заэкранировать точку, точнее контекст "конца слова", который точка и несёт? Или стоит заменить само выражение? Если будут примеры - вдвойне хорошо.

Спасибо

#102310

zerg, использование perl принципиально? Основная задача извлечь из правила только адрес без маски, я правильно понял?
Почему бы не использовать awk?

#102313
Lupo Alberto написал:
zerg, использование perl принципиально? Основная задача извлечь из правила только адрес без маски, я правильно понял?

В целом да, но это только кусок кода.

В скрипте есть и запросы к БД, и сортирвки, и формирование списков на отключение, добавление пользователей, на основе отслеживания их баланса. Так что без перла - никак. Желательно использования только перла, т.к. подобных вычислений много (не менее 250 раз за скрипт в циклах), и вызов внешних программ для этого - непозволительная роскошь.

#102316

[console]doc@dt:~$ echo $X
my $rule = "-A INPUT -s 192.168.0.2/32 -j ACCEPT";
doc@dt:~$ echo $X | sed -rn 's~.* ((([0-9]{1,3}\.){3})[0-9]{1,3})/32 .*~\1~p'
192.168.0.2
[/console]

zerg написал:
Товарищи, не подскажите, как это сделать в одно выражение? Чтобы не делать замены и т.д.? Возможно ли заэкранировать точку, точнее контекст "конца слова", который точка и несёт? Или стоит заменить само выражение? Если будут примеры - вдвойне хорошо.

будьте проще. кстати, мой пример и на перловку кладётся. даже проще будет: в перловке [0-9] это \d
а точка экранируется слешем.

#102317
zerg написал:
Суть - забирать слово, стоящее перед фрагментом "/32"

а это НЕ СЛОВО. это некая последовательность из символов 0123456789.
Кто вам мешает писать [0-9.]+ ?
причём, т.к. мин. это 1.1.1.1 а макс это 222.222.222.222 то,
[0-9.]{7,15}
вот и всё...

#102326

drBatty, спасибо за мысль... И за решение - тоже.
Целый месяц решал задачу со "словом", вместо того, чтобы искать цифры с точкой...

Всем спасибо, всё катит

Войдите или зарегистрируйтесь, чтобы ответить.