在SED命令中正确使用捕获组

时间:2017-07-21 10:25:10

标签: bash sed

我需要转换字符串" 1,234" =到=> 1234。 这个字符串只是更大一行的一部分。文件中有数千条这样的行。

我写了一个sed命令,它没有像我期望的那样工作。

echo \"1,234\" | sed 's/\("\)\([0-9]+\)\(,\)\([0-9]+\)\("\)/\2\4/g'

据我了解,在此代码中,

  • \ 1是"
  • \ 2是逗号前的数字
  • \ 3是,
  • \ 4是逗号后的数字

我希望这个命令输出1234,它应该是\ 2 \ 4。但它只会收益" 1,234"。所以我认为它没有被正确解析。一些帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我建议您使用POSIX Extended Regular Expressions(ERE),在这里您不必转义括号和重复运算符。要在sed中启用ERE,您可以使用-E开关(或GNU -r中的sed)。您的表达式将如下所示:

$ echo '"1,234"' | sed -E 's/"([0-9]+),([0-9]+)"/\1\2/g'
1234

为完整起见,如果您逃避+

,原始BRE表达式将正常运行
echo \"1,234\" | sed 's/\("\)\([0-9]\+\)\(,\)\([0-9]\+\)\("\)/\2\4/g'
1234

答案 1 :(得分:0)

您的第二和第四组包含[0-9]+,其匹配任何数字,后跟加号。

看起来你的意思是[0-9]\+,以匹配一个或多个数字。

顺便说一句:没有必要对您不会使用的部分进行分组(\1\3\5)。您可以简化为:

echo \"1,234\" | sed 's/"\([0-9]\+\),\([0-9]\+\)"/\1\2/g'

如果您发现所有\难以处理,您可以使用Extendend正则表达式语法,-E标记:

echo \"1,234\" | sed -E 's/"([0-9]+),([0-9]+)"/\1\2/g'