![группы захвата sed не работают](https://rvso.com/image/83666/%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B%20%D0%B7%D0%B0%D1%85%D0%B2%D0%B0%D1%82%D0%B0%20sed%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82.png)
У меня есть строка формата [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