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

Regex 这个sed命令如何用逗号解析数字?,regex,linux,sed,Regex,Linux,Sed,我很难理解我在中看到的一个数字解析sed命令: 我是一个sed新手,所以我能理解如下: &增加现有内容,而不是替代内容 :a;ta在该行上递归调用替换,直到搜索找不到更多的返回 我希望大家能解释一下 -i做什么?我似乎在手册页上找不到它,尽管我肯定它在那里 我不太清楚\B在这里完成了什么?也许它有助于左右解析优先级,但我不知道如何实现。所以最后 最重要的是,为什么该命令从右向左执行而不是从左向右执行?例如,命令的哪一部分阻止该命令执行以下操作:1234566778,9--->1234566

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

我是一个
sed
新手,所以我能理解如下:

  • &
    增加现有内容,而不是替代内容
  • :a;ta
    在该行上递归调用替换,直到搜索找不到更多的返回
我希望大家能解释一下

  • -i
    做什么?我似乎在手册页上找不到它,尽管我肯定它在那里
  • 我不太清楚
    \B
    在这里完成了什么?也许它有助于左右解析优先级,但我不知道如何实现。所以最后
  • 最重要的是,为什么该命令从右向左执行而不是从左向右执行?例如,命令的哪一部分阻止该命令执行以下操作:
    1234566778,9--->1234566778,9

将此命令一分为二:

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

将此命令平分:

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

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

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

感谢您如此清晰的解释,但为什么这种解析正确地从右向左而不是相反?这是因为LHS上的
\B
(单词之间)和
\>
(单词边界)在RHS上,
\B
是至关重要的,否则sed会被困在数字“123”上的无限循环中,这要感谢这样一个清晰的解释,但是为什么这个解析正确地从右向左,而不是相反?这是因为LHS上的
\B
(单词之间)和
\>
(单词边界)在RHS上,
\B
是至关重要的,否则sed会卡在数字“123”上的无限循环中。这可能更容易理解:
sed-i-r:a;s/([0-9])([0-9]{3})\>/\1,2/;ta'
——找到一个数字,后面跟3个数字,后面跟一个单词边界,然后在3个数字前插入一个逗号。这可能更容易理解:
sed-i-r:a;s/([0-9])([0-9]{3})\>/\1,2/;ta'
--查找一个数字,后面跟3个数字,后面跟一个单词边界,并在3个数字组前插入逗号。