将模式与前一行匹配的移动线

Igo*_*aic 5 bash awk sed

我有一个结构文件

12312
desc: bleh...
9938
desc: blah...
desc: bloh...
desc: blih...
desc: bluh...
9912
desc: blah...
Run Code Online (Sandbox Code Playgroud)

我想移动匹配模式"desc:"的行到前一行或删除行中的'\n',它在每个模式"desc:"之前.

期望的输出:

12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh... 
9912 desc: blah...
Run Code Online (Sandbox Code Playgroud)

我试过了

awk '!/desc:/{
 printf "%s ",$0
 getline
 printf "%s \n",$0
}
/desc/{print}' file
Run Code Online (Sandbox Code Playgroud)

没有结果.

实际上所有的数据都是输出,awk -F\" '{print $4 "\t" $6}' 也许我可以先做点什么?

Chr*_*our 12

一种方式awk:

$ awk '!/^desc:/&&NR>1{print OFS}{printf "%s ",$0}END{print OFS}' file
12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...
Run Code Online (Sandbox Code Playgroud)

说明:

  • !/^desc:/匹配不以desc:不包括文件中第一行开头的行NR>1.
  • {print OFS}在匹配的行之前打印输出字段分隔符.在awk默认情况下OFS\n.
  • {printf "%s ",$0} 打印每一行没有尾随换行符.
  • END{print OFS} 读取文件后添加尾随换行符.

现场演示:http://ideone.com/ajH14u

  • `END {print OFS}`将在每行的末尾添加一个空格,使用`END {print""}`仅打印换行符.您还使用`printf"%s",$ 0`而不是`printf"%s",$ 0`在每行的末尾添加第二个空格,但是您需要重新考虑脚本逻辑来解决这个问题. (3认同)

bar*_*mar 12

sed oneliner

sed ':a $!N;s/\ndesc/ desc/;ta P;D'
Run Code Online (Sandbox Code Playgroud)

会输出

12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...
Run Code Online (Sandbox Code Playgroud)