2

我正在尝试替换具有尾随减号的值并用前导减号替换它们。我有这个在 SED 中不太适用的正则表达式,虽然我不明白为什么。

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

SED 回报 8.8-

我在 Notepad++ RegEx Help 插件中尝试了匹配 8.8- 并将子匹配 \1 标识为 8.8 的表达式

4

3 回答 3

4

\d是一个Perlism。Sed 指的是较旧的 Perl 之前的 POSIX 标准。你可能想要的是

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

[[:digit:]]是编写 Perl 的 POSIX 方式\d

当然[0-9],正如其他人所指出的那样,您可以只写 。

顺便说一句,您需要-r使括号随心所欲地工作。

于 2012-04-24T20:45:59.270 回答
3

\d不匹配 sed 中的数字字符类,[0-9]但会。

顺便说一句,请包括你真正想做的事情——你在处理数字吗?整数和小数?我可以从您的 RegEx 中推断出尽可能多的内容,但如果问题被正确提出,则不需要。

编辑

如果您使用的是 GNU linux,最好使用字符类而不是传统范围,因为它们更便携:

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

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

于 2012-04-24T20:31:26.767 回答
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
于 2012-04-24T20:36:44.693 回答