Sed и захват групп борются

Ни bash , ни ksh не могут выполнять арифметические действия с плавающей запятой ( ksh93 поддерживает это, если я правильно помню). Я рекомендую переключиться на zsh или запустить внешний инструмент, например bc :

$ CPU_IDLE=98.67
$ echo "$CPU_IDLE"
$ CPU_USAGE=$( bc <<< "100 - $CPU_IDLE" )
$ echo "$CPU_USAGE"
1.33
2
25.04.2018, 02:15
3 ответа

В стандартном базовом регулярном выражении (?\(\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 поддерживает некоторые \Xescape-символы, они не являются стандартными (и я не думаю, что он поддерживает\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...)

См. также:

9
27.01.2020, 21:52

Мы также можем сделать это ниже команды awk

echo "123-45-6789-10101"| awk '{gsub("[^0-9]","",$1);print }'

Выход

12345678910101
1
27.01.2020, 21:52

ilkkachu очень хорошо описал почему ваше регулярное выражение не работает сsed(оно на диалекте не поддерживается ).

Вот альтернативный способ, который просто удаляет символы, которые не являются1:

sed 's/[^1]//g' file

Чтобы использовать группы, вы можете сделать что-то вроде

sed -E 's/([^1]*)(1+)([^1]*)/\2/g' file

То есть сопоставить не -пустую строку единиц, разделенную с обеих сторон возможно пустой строкой не -единиц, и заменить все это совпадающей строкой единиц.

Измените 1на [0-9]и [^1]на [^0-9], чтобы обрабатывать все цифры.

0
27.01.2020, 21:52

Теги

Похожие вопросы