Соответствие регулярному выражению в стиле с ++ с sed? - PullRequest
0 голосов
/ 30 мая 2020

Кто-нибудь знает, как сопоставить это регулярное выражение в стиле C ++ с помощью sed? В частности, чтобы разбить его на несколько частей, используя (шаблон) и \ n?

// ZIP code pattern: XXddddd-dddd and variants
regex pat (R"(\w{2}\s*\d{5}(−\d{4})?)");

Например, следующая строка будет соответствовать AB00000-0000 и \ 1, \ 2, \ 3 будет печатать соответствующие подстроки из пространства шаблонов .

РЕШЕНИЕ: Вот ответ sed, который учитывает начальные два символа.

$ echo AB00000-0000 | sed 's/\([[:alpha:]]\{2\}\)[[:space:]]*\([[:digit:]]\{5\}\)\(-\([[:digit:]]\{4\}\)\)\{0,1\}/\1 \2 \4/' 
AB 00000 0000

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Это:

\w{2}\s*\d{5}(−\d{4})?

- это PCRE (как будет работать в perl или GNU grep -P, и может быть записано как POSIX ERE (как будет работать в awk или grep -E) или GNU / OSX sed -E) как:

[[:alnum:]_]{2}[[:space:]]*[[:digit:]]{5}(−[[:digit:]]{4})?

или в POSIX BRE (как будет работать в grep или sed без -E) как:

[[:alnum:]_]\{2\}[[:space:]]*[[:digit:]]\{5\}\(−[[:digit:]]\{4\}\)\{0,1\}
0 голосов
/ 30 мая 2020

Предположим, у вас есть файл, содержащий:

NJ 08542-0033
PA19103-0200
NY10002

Тогда команда sed:

sed 's/[[:alpha:]]\{2\}[[:space:]]*\([[:digit:]]\{5\}\)\(-\([[:digit:]]\{4\}\)\)\{0,1\}/\1 \3/' file

выведет:

08542 0033
19103 0200
10002
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...