这个sed命令如何用逗号分析数字?

时间:2015-07-21 20:27:26

标签: regex linux sed

我很难理解我在this article中看到的数字解析sed命令:

sed -i ':a;s/\B[0-9]\{3\}\>/,&/;ta' numbers.txt

我是sed新手,所以这就是我能够弄清楚的:

  • &增加了已经存在的内容而不是替代
  • :a; ... ;ta在该行上递归调用替换,直到搜索找不到更多返回

这是我希望大家可以解释的内容

  • -i做什么?我似乎无法在手册页上找到它,虽然我确定它在那里。
  • 我对\B在这里完成的事情有点模糊?也许它有助于左右解析优先级,但我不知道如何。最后......
  • 最重要的是,为什么从右到左而不是从左到右执行?例如,命令的哪一部分阻止它执行以下操作:1234566778,9 ---> 1234,566,778,9

2 个答案:

答案 0 :(得分:3)

平分此命令:

sed -i ':a;s/\B[0-9]\{3\}\>/,&/;ta' numbers.txt

-i     # inline editing to save changes in input file
\B     # opposite of \b (word boundary) - to match between words
[0-9]  # match any digit
\{3,\} # match exact 3 digits
\>     # word boundary
&      # use matched pattern in replacement
:a     # start label a
ta     # go back to label a until \B[0-9]\{3\}\> is matches

是的确这个sed命令从最右边的3位开始匹配/替换并继续向左移动直到找到3位数。

更新:然而,在循环中查看此效率低下的 sed命令,我建议使用更简单,更快速的awk

awk '/^[0-9]+$/{printf "%\047.f\n", $1}' file
20,130,607,215,015
607,220,701
992,171

输入文件为:

cat file
20130607215015
607220701
992171

答案 1 :(得分:2)

匹配是贪婪的,即它匹配最左边的三个数字前面没有单词边界后跟单词边界,即最右边的三个数字。插入逗号后," goto"使它再次匹配,但逗号引入了一个新的单词边界,因此匹配发生得更早。