sed 's/-\([0-9.]\+\)/(\1)/g' inputfile 这个命令是什么意思?

juj*_*uju 3 sed

我试图找出以下命令的含义:

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
Run Code Online (Sandbox Code Playgroud)

我知道这与非数字字符有关。

ilk*_*chu 12

在 GNU sed 中,它查找一个破折号,后跟一些数字或点,并用括号中的相同数字替换它。也就是说,它变成-123.45(123.45)

在其他一些seds 中,例如 macOS 上基于 BSD 的 s,它查找破折号、数字或点以及文字加号,然后删除破折号并将其余部分括在括号中。也就是说,它变成-1+(1+),但保留了-123原样。


区别是因为\+在基本正则表达式中没有标准含义。GNU 将其解释为与+扩展正则表达式相同,即“一个或多个先前的”,而其他人则将其视为文字+.

至于左侧模式中的其他部分,破折号匹配自身,[0-9.]匹配任何一个数字或点,并\( .. \)捕获中间的部分。在替换中,括号是字面意思,并\1放回\( .. \).

更可移植的是,这应该是

两者都应该用括号替换数字前面的破折号。