我需要在两个字符后插入一个空格,然后在每三个字符后插入一个空格。
数据:
97100101101102101
预期输出:
97 100 101 101 102 101
尝试过的代码:
sed 's/.\{2\}/& /3g'
答案 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