группы захвата sed не работают

группы захвата sed не работают

У меня есть строка формата [0-9]+\.[0-9]+\.[0-9]. Мне нужно извлечь первое, второе и третье числа по отдельности. Насколько я понимаю, группы захвата должны быть способны на это. Я должен иметь возможность использовать sed "s/\([0-9]*\)/\1/gдля получения первого числа, sed "s/\([0-9]*\)/\2/gдля получения второго числа и sed "s/\([0-9]*\)/\3/gдля получения третьего числа. В каждом случае, однако, я получаю всю строку. Почему это происходит?

решение1

Мы не можем дать вам полный ответ без примера вашего ввода, но я могу сказать, что ваше понимание групп захвата неверно. Вы не используете их последовательно, они только ссылаются на регулярное выражение в левой части того же оператора подстановки. Если вы захватываете, например, /(foo)(bar)(baz)/, то fooбудет \1, barбудет \2и bazбудет \3. Вы не можете сделать s/(foo)/\1/; s/(bar)/\2/, потому что во втором s///вызове есть только одна захваченная группа, поэтому \2не будет определена.

Итак, чтобы зафиксировать три группы цифр, вам необходимо сделать следующее:

sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'

Или, более читабельно:

sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'

решение2

Пример:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78

Или все вместе:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78

решение3

Используйте Sed с параметрами -r, --regexp-extended, чтобы избежать всех экранированных скобок.

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/' 
1234, 567, 89    #output

Связанный контент