在第二个字符之后插入一个空格,后跟每三个字符

时间:2016-06-17 10:54:35

标签: linux unix sed

我需要在两个字符后插入一个空格,然后在每三个字符后插入一个空格。

数据:

97100101101102101

预期输出:

97 100 101 101 102 101

尝试过的代码:

sed 's/.\{2\}/& /3g'

2 个答案:

答案 0 :(得分:5)

分两步:

$ sed -r -e 's/^.{2}/& /' -e 's/[^ ]{3}/& /g' <<< 97100101101102101
97 100 101 101 102 101 

那是:

  • 's/^.{2}/& /'
    抓住线上的前两个字符,然后用空格打印出来。

  • 's/[^ ]{3}/& /g'
    捕获三个连续的非空格字符并打印回来后跟一个空格。

答案 1 :(得分:1)

使用GNU awk:

$ echo '97100101101102101' | awk '{print substr($0,1,2) gensub(/.{3}/," &","g",substr($0,3))}'
97 100 101 101 102 101

请注意,与当前接受的sed解决方案不同,这不会在行尾添加空白字符,例如使用_代替空白可以使问题可见:

$ echo '97100101101102101' | sed -r -e 's/^.{2}/&_/' -e 's/[^_]{3}/&_/g'
97_100_101_101_102_101_

$ echo '97100101101102101' | awk '{print substr($0,1,2) gensub(/.{3}/,"_&","g",substr($0,3))}'
97_100_101_101_102_101

即使输入包含空白字符,它也会起作用:

$ echo '971 0101101102101' | sed -r -e 's/^.{2}/& /' -e 's/[^ ]{3}/& /g'
97 1 010 110 110 210 1

$ echo '971 0101101102101' | awk '{print substr($0,1,2) gensub(/.{3}/," &","g",substr($0,3))}'
97 1 0 101 101 102 101