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

标签 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

最佳答案

平分这个命令:

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

关于regex - 这个 sed 命令如何用逗号解析数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31548978/

相关文章:

javascript - 数字的条件(?)正则表达式

Java正则表达式匹配用冒号分隔的多个数字序列

c# - 如何检查字符串是否包含特定格式

linux - 我的内核中有哪个 fuse 版本?

bash - 如何在 sed 脚本中使用 sed 删除括号内的字符串?

R - grep 删除大写行

linux - wrsmr 命令没有在 MSR 中注册我的输入

linux - Varnish 停止工作并在启动 OK 后死亡

sed - 使用 sed 查找并追加多行多个文件?

shell - 将动态变化的字符串存储到变量中