regexp (sed) как 1-экранировать специальные символы и 2-группировать их - PullRequest
1 голос
/ 14 мая 2011

Мне нужно регулярное выражение, которое может извлечь любую группу из двух цифр, окруженных одинаковыми не алфавитными символами, например, извлечь "02" из строки "my_file_name-02-and_some"

Насколько я понял:

echo 'my_file_name-02-and_some' | sed 's/.*[-_]\([0-9][0-9]*\)[-_].*/\1/g'

производит

02 (фу, два часа + за этот результат), но

echo 'my_file_name-002-and_some' | sed 's/.*[-_]\([0-9][0-9]*\)[-_].*/\1/g'

производит

002 так что это на самом деле не работает :(. Также мне бы хотелось, чтобы оно совпадало с "my_file_name (02) and_some" и другими возможными окружающими персонажами, идея в том, что эти два окружающих символа должны быть то же самое ..? Черт возьми, у меня болит голова.

Боюсь, что с учетом контекста, у этого было в качестве регулярного выражения sed.

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Для окружающих ЖЕ символов:

twonum=`echo 'my_file_name-00-andsome' | sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'`

будет выдавать 00. Помните, что вы также можете использовать обратные ссылки в LHS.

sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
            ^this is 1st     ^that's \1 mean: THE SAME as in 1st \(...\) group

добавление соответствия [] и ()может использовать это (не хорошо, но, надеюсь, работает)

sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/;s/^.*(\([0-9][0-9]\)).*$/\1/;s/^.*\[\([0-9][0-9]\)\].*$/\1/'
1 голос
/ 14 мая 2011

Это будет ваша проблема:

([0-9][0-9]*)

Если вам нужны только две цифры, вам не нужен *, что означает «0 или более из того, что находится передо мной».Вот почему он соответствует 002.

...