У меня есть строка в формате [0-9]+\.[0-9]+\.[0-9]
. Мне нужно извлечь первое, второе и третье числа отдельно. Насколько я понимаю, группы захвата должны быть способны на это. Я должен быть в состоянии использовать, sed "s/\([0-9]*\)/\1/g
чтобы получить первый номер, sed "s/\([0-9]*\)/\2/g
получить второй номер и sed "s/\([0-9]*\)/\3/g
получить третий номер. В каждом случае, однако, я получаю всю строку. Почему это происходит?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
захвата отдельных номеров.Ответы:
Мы не можем дать вам полный ответ без примера вашего вклада, но я могу вам сказать, что ваше понимание групп захвата неверно. Вы не используете их последовательно, они относятся только к регулярному выражению в левой части того же оператора замещения. Если вы захватите, например,
/(foo)(bar)(baz)/
тоfoo
будет\1
,bar
будет\2
иbaz
будет\3
. Вы не можете сделать этоs/(foo)/\1/; s/(bar)/\2/
, потому что во второмs///
вызове есть только одна захваченная группа, поэтому\2
она не будет определена.Итак, чтобы получить три группы цифр, вам нужно сделать:
Или, тем более читаемым:
источник
/(foo)/
в Sed будет соответствовать буквальный(
символ,foo
а затем и буквальный)
. Если вы хотите захватить группу, вам нужно либо убрать скобки, либо использовать эту-E
опцию.-r
флаг, поэтому я предполагаю, что поэтому я еще не сталкивался с этим.-r
флаг тоже это сделает, но он не переносимый. GNU sed поддерживает это, но многие другие этого не делают. Это-E
более универсально.Пример:
Или все вместе:
источник
Используйте Sed с -r, --regexp-extended, чтобы избежать всех экранированных скобок.
источник