用文件中指定位置的换行符替换空格

时间:2014-10-23 05:41:25

标签: shell unix sed

InputFile:

filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12

我需要将field3,field6,field9之后的空格替换为换行符。 我尝试了下面的sed命令并且它工作正常,但我正在寻找一个更优化的解决方案,以便处理具有更多字段的输入文件。

sed -e 's/ /\
/3' -e 's/ /\
/6' -e 's/ /\
/9' InputFile

提前致谢。

4 个答案:

答案 0 :(得分:2)

使用grep

 echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | grep -oE '([^ ]+ *){3}'

将产生输出

filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12

使用sed

 echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | sed -r  's/(([^ ]+ *){3})/\1\n/g'

将产生输出

filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12

/(([^ ]+ *){3}匹配除空格之外的任何内容,后跟空格3次,有效地选择3个字段。

 echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | awk  '{for(i=1;i<NF;i+=3) print $i, $(i+1), $(i+2)}'

将输出

filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12

Throgh basic sed,

$ echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | sed 's/\(\([^ ]\+ \)\{3\}\)/\1\n/g'
filed1 field2 field3 
field4 field5 field6 
field7 field8 field9 
field10 field11 field12

答案 1 :(得分:1)

sed 's/\(\([^ ]\{1,\} \{1,\}\)\{2\}\([^ ]\{1,\}\) \{1,\}/\1\
/g' YourFile

用一条新线替换一组2组(非空格+空格)而不是1个非空格后的空格,并重复这一过程,直到它可以在线上。

Posix版本为{GNU sed <{1}}

--posix

应该适用于GNU sed(不能从这里测试)

sed 's/(([^ ]+ +){2}([^ ]+) +/\1\n/g' YourFile

也应该在sed上工作(取决于实现)

答案 2 :(得分:1)

以下是awk版本:

awk '{for (i=1;i<=NF;i++) printf "%s%s",$i,(i%3?FS:RS)}' file
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12

PS这并没有停留在3,6,9,而是继续(12,15,18 ......)

for (i=1;i<=NF;i++)通过一个和一个字段循环 printf打印数据$i打印当前数据。 i%3?FS:RS如果提交的是3号,请使用换行符RS,否则请使用字段分隔符FS

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/ /\n/3;P;D' file

这会将第三个空格更改为换行符,然后打印并删除最多并包含换行符,并重复该过程直到该行被占用。