我很难理解我在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
答案 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"使它再次匹配,但逗号引入了一个新的单词边界,因此匹配发生得更早。