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

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

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

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)

相关内容