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