В стандартном базовом регулярном выражении (?\(\d(3}\)[-.]?
означает:
a literal left parenthesis
a literal question mark
(start of a group)
a literal character 'd'
a literal left parenthesis
the number '3'
a literal closing brace
(end of group)
a dash or a dot
a question mark
т. е. это напечатаетx
:
echo '(?d(3}-?' |sed 's/(?\(\d(3}\)[-.]?/x/'
Скорее всего, вы захотите sed -E
включить расширенные регулярные выражения (ERE ), а затем использовать (
и )
для группировки, а \(
и \)
для буквальных выражений. скобка.
Также обратите внимание, что \d
является частью регулярных выражений Perl, а не стандартных, и хотя GNU sed поддерживает некоторые \X
escape-символы, они не являются стандартными (и я не думаю, что он поддерживает\d
). То же самое для \?
, GNU sed поддерживает его в BRE для обозначения того, что ?
означает в ERE, но это не стандарт.
Имея это в виду:
$ echo '(123)-456-7890' | sed -E 's/\(?([0-9]{3})\)?[-.]?([0-9]{3})[-.]?([0-9]{4})/\1\2\3/'
1234567890
Хотя с таким же успехом можно просто переборщить и удалить все, кроме цифр:
$ echo '(123)-456-7890' | sed -e 's/[^0-9]//g'
1234567890
(, который, конечно, также будет принимать такие вещи, как (123)-4.5-6-7a8b9c0
...)
См. также:
regex(7)