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

标签 regex sed

如何利用 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/

相关文章:

c# - 允许任何 ASCII 字符的正则表达式模式。但不带空格

python - 如何使用多行正则表达式完成删除整行?

Java用正则表达式分割字符串,双引号内的任何内容

linux - 在 Linux 中使用字典查找和替换单词

linux - 在 awk 中使用空行作为文件分隔符

javascript正则表达式问号(?)未检测到

java - 相同的正则表达式,但使用 StringTokenizer 和 Scanner 类定界符给出不同的结果

sed - 如何告诉 sed "dot match new line"

bash - 需要使用 sed 更改 json 文件的值

nmap 服务文件上的正则表达式