gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:00:14 25 4
gpt4 key购买 nike

如何利用 sed 在每三位数字之间插入空格,但仅当数字长于 10 位时,即:

blahaaaaaa goog sdd 234 3242423
ala el 213123123123
1231231313123 i 14124124141411

应该变成:

blahaaaaaa goog sdd 234 3242423
ala el 213 123 123 123
123 123 131 312 3 i 141 241 241 414 11

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

最佳答案

一个 (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

更新:

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

说明:

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

关于regex - sed 在长数字的数字之间插入空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62719581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com