我试图找出以下命令的含义:
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放回\( .. \).
更可移植的是,这应该是
在扩展 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)两者都应该用括号替换数字前面的破折号。