Привет, у меня есть файл, содержащий числа вроде

-640.68739330746

Который мне нужно изменить на

(-  640.68739330746 )

Я пробовал использовать этот код

sed 's/(-[0-9]\d*(\.\d+))/\(\(-\s\s[0-9]\d*(\.\d+)\s\))\1\*\2//g'

Но я получаю ошибки

0
Leo Karti 13 Ноя 2019 в 17:38
sed не поддерживает \d с одной стороны, а в конце есть лишний /
 – 
Sundeep
13 Ноя 2019 в 17:41

2 ответа

Используйте класс символов [0-9] для сопоставления цифр и полагайтесь на группы захваченных регулярных выражений (...):

sed -E 's/-([0-9]+\.[0-9]+)/(- \1 )/g' file

Образец теста:

$ cat s1
-640.68739330746 -1.3 sdfsdf
-2.3333
$ sed -E 's/-([0-9]+\.[0-9]+)/( & )/g' s1
(- 640.68739330746 ) (- 1.3 ) sdfsdf
(- 2.3333 )
3
RomanPerekhrest 13 Ноя 2019 в 17:44
Я думаю, вы имели в виду (- \1 ), поскольку OP имеет пробел между - и числом в ожидаемом выводе
 – 
Sundeep
13 Ноя 2019 в 17:44

Не могли бы вы попробовать следующее, если вас устраивает awk:

awk '{for(i=1;i<=NF;i++){if($i<0){$i="( "$i" )"}}} 1' Input_file


Скажем, следующее - Input_file (только тестовые данные):

cat Input_file
-640.68739330746 efuiweiuwv wnwvn 1213133 -0.9 -4 wvnwnvrnvn

Когда мы запускаем следующий код, получаем следующий вывод.

awk '{for(i=1;i<=NF;i++){if($i<0){$i="( "$i" )"}}} 1' Input_file
( -640.68739330746 ) efuiweiuwv wnwvn 1213133 ( -0.9 ) ( -4 ) wvnwnvrnvn
0
RavinderSingh13 13 Ноя 2019 в 17:45