2012-04-24 5 views
2

Я пытаюсь заменить значения, имеющие знак минус минус и заменяя их знаком «минус». У меня есть это регулярное выражение, которое не совсем работает в SED, хотя я не понимаю, почему.Замените минус минус минусом

echo '8.8-' | sed 's/(\d+(?:\.\d+)?)-/-\\1/' 

SED возвращает 8.8-

Я попробовал выражение в Notepad ++ RegEx Помощь плагин, который соответствует 8.8- и определяет суб-матч \ 1, как 8,8

ответ

4

\d является Perlism. Sed относится к старому, pre-Perl, стандарту POSIX. То, что вы, вероятно, хотите,

echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/' 

[[:digit:]] путь POSIX писать в Perl \d.

Конечно, вы можете просто написать [0-9], вместо этого, как отметили другие.

Кстати, вам нужны -r, чтобы ваши круглые скобки работали по вашему желанию.

+0

Спасибо за подробное объяснение. – Todd

3

\d не соответствует цифровой символ класс в sed, [0-9] будет.

BTW, пожалуйста, укажите, что именно вы ДЕЙСТВИТЕЛЬНО пытаетесь сделать - работаете ли вы с цифрами? Интс и десятичный? Я могу вывести столько же из вашего RegEx, но не нужно, если вопрос задан правильно.

EDIT

Если вы используете GNU Linux, лучше использовать классы символов, чем традиционные диапазоны, как они более портативны:

echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/' 

http://sed.sourceforge.net/sedfaq3.html

1
echo '8- 8.1- 81.2- 8.28- 82.28-' | sed -r 's/([0-9]+(.[0-9]+)?)-/-\1/g' 

Результаты

-8 -8.1 -81.2 -8.28 -82.28 

Sed просто не понимает \ d \ или D:

echo "456" | sed -r 's/\d/+/g' 
456 
Смежные вопросы