sed 在长数字的数字之间插入空格

Paw*_*wel 3 regex sed

如何利用 sed 在每三位数字之间插入空格,但前提是数字长度超过 10 位数字,即:

blahaaaaaa goog sdd 234 3242423
ala el 213123123123 
1231231313123 i 14124124141411
Run Code Online (Sandbox Code Playgroud)

应该变成:

blahaaaaaa goog sdd 234 3242423
ala el 213 123 123 123
123 123 131 312 3 i 141 241 241 414 11
Run Code Online (Sandbox Code Playgroud)

我可以使用轻松分隔 3 位数字sed 's/[0-9]\{3\}/& /g',但无法将其与数字长度结合起来。

M. *_*din 5

单个 (GNU)sed命令就足够了:

sed -E 's/([0-9]{10,})/\n&\n/g; :a; s/([ \n])([0-9]{3})([0-9]+\n)/\1\2 \3/; ta; s/\n//g' file
Run Code Online (Sandbox Code Playgroud)

更新:

Walter A建议使用更简洁的sed表达方式,如果我没有忽略某些内容,效果很好:

sed -E 's/([0-9]{10,})/&\n/g; :a; s/([0-9]{3})([0-9]+\n)/\1 \2/; ta; s/\n//g' file
Run Code Online (Sandbox Code Playgroud)

解释:

  • -Eflag 指示sed使用扩展正则表达式语法(以消除(){}+字符前的转义斜杠)。
  • s/([0-9]{10,})/&\n/g将换行符 ( \n) 附加到所有 10 个或更多数字的数字序列。这是为了区分我们正在处理的数字序列。这里是\n一个安全的选择,因为它不能出现在从输入行读取的模式空间中,因为它是终止该行的分隔符。请注意,我们每个周期处理一行(即,由于没有使用多行技术,因此\n可以用作锚点,而不会干扰行中的其他字符)。
  • :a; s/([0-9]{3})([0-9]+\n)/\1 \2/; ta这是一个循环:a是一个标签,可以是任何单词(:表示标签)。表示如果最后一次替换(命令)成功则ta跳转到标签。这里的命令重复地(因为它是循环体)从左到右替换一个由空格字符连接的相同 3 位数字的 3 位序列,前提是该 3 位序列后面紧跟着一个或更多由字符分隔的数字,直到无法替换为止。ass\n
  • s/\n//g\n从结果模式空间中删除所有实例。它们已被用作锚点或标记,以定界超过或等于 10 个字符的数字序列的末尾。现在他们的使命已经完成了。

  • +1。一个解释会很有用。是 `sed -E 's/([0-9]{10,})/&\n/g; :A; s/([0-9]{3})([0-9]+\n)/\1 \2/; 他;s/\n//g' file` 也工作吗? (2认同)