我试图找出以下命令的含义:
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
我知道这与非数字字符有关。
答案1
在 GNU sed 中,它查找破折号后跟一些数字或点,并将其替换为括号中的相同数字。也就是说,它变成-123.45
了(123.45)
。
在其他一些sed
系统中,例如 macOS 上基于 BSD 的系统,它会查找破折号、数字或点以及文字加号,然后删除破折号并将其余部分括在括号中。也就是说,它变成-1+
了(1+)
,但留下了-123
原样的东西。
区别是因为\+
在基本正则表达式中没有标准含义。 GNU 将其解释为与扩展正则表达式中的相同+
,即“前面的一个或多个”,而其他人则将其视为字面意思+
。
至于左侧模式中的其他部分,破折号与其自身匹配,[0-9.]
匹配任何一个数字或点,并\( .. \)
捕获中间的部分。在替换中,括号是字面意思,并\1
放回 中的任何内容\( .. \)
。
更便携的是,应该是
在扩展 RE 中,假设你
sed
支持-E
,很多人都会这样做:sed -E 's/-([0-9.]+)/(\1)/'
在基本 RE 中:
sed 's/-\([0-9.]\{1,\}\)/(\1)/'
两者都应该用括号替换数字前面的破折号。
答案2
看起来它改变了负数的格式,从-
前面有一个改为用括号括起来。
它搜索以 开头的序列,-
后跟一系列与数字和小数[0-9.]
相匹配的数字和小数,并\+
对其进行修改以匹配序列中的一个或多个此类字符。数字和小数序列位于 内部\(...\)
,这是第一个表达式,在替换子句中,(\1)
会将第一个表达式粘贴到 之间()
。最终结果是删除数字前面的负号并将其括在括号中。
因此,输入:
test value: -123.4
输出应该是以下形式
test value: (123.4)