Обратная ссылка в регулярном выражении Awk

Вам просто нужно установить репозиторий epel : yum -y install epel-release , чтобы сделать пакет openvpn доступен.

3
26.04.2017, 21:27
1 ответ

Отсутствует в стандарте awk (POSIX awk использует POSIX ERE, которые не поддерживают обратные ссылки, а \1 означает символ 0x1 в awk, хотя есть некоторые неясности). Это возможно с busybox awk, используя:

busybox awk '$0 ~ "^(.*)o\\1$"'

(что это может или не может делать (независимо от того, должно ли "\\1" соответствовать буквальному \1 или символ 0x1 или быть неуказанным) неясно в спецификации POSIX. В моем прочтении кажется, что он должен соответствовать символу 0x1, но это не так с /usr/xpg4/bin/sh например, на Solaris 11, который является сертифицированной ОС (где он соответствует буквальному \1))

С любым awk для этого конкретного регулярного выражения вы можете такой подход:

awk 'length % 2 && \
       substr($0, (length+1)/2, 1) == "o" && \
       substr($0, 1, (length-1)/2) == substr($0, (length+3)/2)'

Как упоминалось выше, ERE POSIX не поддерживают обратные ссылки. GNU sed с -r использует ERE, но это GNU ERE, которые поддерживают обратные ссылки как расширение стандарта.Это означает, что

grep -Ex '(.*)o\1'

(или то же самое с egrep) не является переносимым. Однако:

grep -x '\(.*\)o\1'

является POSIX и переносимым. POSIX BRE поддерживают обратные ссылки, как и исторические реализации grep. perl регулярные выражения или PCRE также поддерживают обратные ссылки, поэтому вы можете сделать:

perl -lne 'print if /^(.*)o\1$/'
11
27.01.2020, 21:11

Теги

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