2015-01-26 5 views
1

Я пытаюсь сделать простой поиск заменить цифру при добавлении значения, но не смог сделать это в Mac OS X, например.Mac OS X sed regexp

echo "abc top: 234px" |sed -E 's/top:[[:space:]]*([0-9]+)/echo $(echo "\1+16"|bc)/g' 

, который должен вывести: "abc top: 250px"

Вместо этого он выводит: abc echo $(echo "234+16"|bc)px

+0

Использование жестких кавычки (' '') является предотвращение '$ (эхо "\ 1 + 16" | бв) 'от расширения. –

+0

@PaulR то, что работает тогда – sakhunzai

+1

Вам просто нужно исправить ваше цитирование, т. Е. Не использовать жесткие цитаты вокруг вещей, которые вы хотите расширить. –

ответ

1

Вы не можете вернуть в обратную ссылку, используя внешнюю команду - когда echo | bc оценивается (как только вы исправить кавычки так что они вообще оцениваются в первую очередь), сценарий sed еще не разобран.

Что вы можете сделать, это переключиться на инструмент, который позволяет выполнять арифметику по захваченным значениям.

echo "abc top: 234px" | 
perl -pe 's/(top:\s*)(\d+)/ sprintf("%s%i", $1, 16+$2)/ge' 
1

Трудно с СЕПГ, но вот Perl решение:

$ echo "abc top: 234px" | perl -pe 's/(\d+)/16 + $1/ge' 
abc top: 250px 
+0

спасибо @PaulR, это также работает – sakhunzai

2

Вот awk

echo "abc top: 234px" | awk '$NF=$NF+16"px"' 
abc top: 250px 

Некоторые более надежные с поиском для top:

echo "abc top: 234px" | awk '/top:/ {$NF=$NF+16"px";print}' 
abc top: 250px 

Здесь вам не нужен формат префикса px:

echo "abc top: 234px" | awk 'sub(/[0-9]+/,$NF+16)' 
abc top: 250px 

или

echo "abc top: 234px" | awk '/top:/ {sub(/[0-9]+/,$NF+16);print}' 
abc top: 250px 
+0

, что намного лучше, спасибо – sakhunzai