我试图找出以下命令的含义:
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
Run Code Online (Sandbox Code Playgroud)
我知道这与非数字字符有关。
ilk*_*chu 12
在 GNU sed 中,它查找一个破折号,后跟一些数字或点,并用括号中的相同数字替换它。也就是说,它变成-123.45
了(123.45)
。
在其他一些sed
s 中,例如 macOS 上基于 BSD 的 s,它查找破折号、数字或点以及文字加号,然后删除破折号并将其余部分括在括号中。也就是说,它变成-1+
了(1+)
,但保留了-123
原样。
区别是因为\+
在基本正则表达式中没有标准含义。GNU 将其解释为与+
扩展正则表达式相同,即“一个或多个先前的”,而其他人则将其视为文字+
.
至于左侧模式中的其他部分,破折号匹配自身,[0-9.]
匹配任何一个数字或点,并\( .. \)
捕获中间的部分。在替换中,括号是字面意思,并\1
放回\( .. \)
.
更可移植的是,这应该是
在扩展 RE 中,假设您sed
支持-E
,许多人会这样做:
sed -E 's/-([0-9.]+)/(\1)/'
Run Code Online (Sandbox Code Playgroud)在基本 RE 中:
sed 's/-\([0-9.]\{1,\}\)/(\1)/'
Run Code Online (Sandbox Code Playgroud)两者都应该用括号替换数字前面的破折号。