我正在尝试替换具有尾随减号的值并用前导减号替换它们。我有这个在 SED 中不太适用的正则表达式,虽然我不明白为什么。
echo '8.8-' | sed 's/(\d+(?:\.\d+)?)-/-\\1/'
SED 回报 8.8-
我在 Notepad++ RegEx Help 插件中尝试了匹配 8.8- 并将子匹配 \1 标识为 8.8 的表达式
我正在尝试替换具有尾随减号的值并用前导减号替换它们。我有这个在 SED 中不太适用的正则表达式,虽然我不明白为什么。
echo '8.8-' | sed 's/(\d+(?:\.\d+)?)-/-\\1/'
SED 回报 8.8-
我在 Notepad++ RegEx Help 插件中尝试了匹配 8.8- 并将子匹配 \1 标识为 8.8 的表达式
这\d
是一个Perlism。Sed 指的是较旧的 Perl 之前的 POSIX 标准。你可能想要的是
echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/'
这[[:digit:]]
是编写 Perl 的 POSIX 方式\d
。
当然[0-9]
,正如其他人所指出的那样,您可以只写 。
顺便说一句,您需要-r
使括号随心所欲地工作。
\d
不匹配 sed 中的数字字符类,[0-9]
但会。
顺便说一句,请包括你真正想做的事情——你在处理数字吗?整数和小数?我可以从您的 RegEx 中推断出尽可能多的内容,但如果问题被正确提出,则不需要。
编辑
如果您使用的是 GNU linux,最好使用字符类而不是传统范围,因为它们更便携:
echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\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