Ни bash
, ни ksh
не могут выполнять арифметические действия с плавающей запятой ( ksh93
поддерживает это, если я правильно помню). Я рекомендую переключиться на zsh
или запустить внешний инструмент, например bc
:
$ CPU_IDLE=98.67
$ echo "$CPU_IDLE"
$ CPU_USAGE=$( bc <<< "100 - $CPU_IDLE" )
$ echo "$CPU_USAGE"
1.33
В стандартном базовом регулярном выражении (?\(\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)
Мы также можем сделать это ниже команды awk
echo "123-45-6789-10101"| awk '{gsub("[^0-9]","",$1);print }'
Выход
12345678910101
ilkkachu очень хорошо описал почему ваше регулярное выражение не работает сsed
(оно на диалекте не поддерживается ).
Вот альтернативный способ, который просто удаляет символы, которые не являются1
:
sed 's/[^1]//g' file
Чтобы использовать группы, вы можете сделать что-то вроде
sed -E 's/([^1]*)(1+)([^1]*)/\2/g' file
То есть сопоставить не -пустую строку единиц, разделенную с обеих сторон возможно пустой строкой не -единиц, и заменить все это совпадающей строкой единиц.
Измените 1
на [0-9]
и [^1]
на [^0-9]
, чтобы обрабатывать все цифры.