根据前一行的模式将前一行与下一行连接

时间:2019-05-27 11:25:05

标签: sed

我有这个输入:

{"title : ", "link : ", ...}

我想要使用sed命令输出

1 a
a
2 b b
3 c
c
4 d d
5 e e
6 f
f
7 g
g

我正在尝试未成功

1 a a
2 b b
3 c c
4 d d
5 e e
6 f f
7 g g

4 个答案:

答案 0 :(得分:1)

另一个awk:

$ awk 'BEGIN{RS=""}{for(i=1;i<=NF;i+=3)print $i,$(i+1),$(i+2)}' file
1 a a
2 b b
3 c c
4 d d
5 e e
6 f f
7 g g

解释:

$ awk 'BEGIN {
    RS=""                       # prime awk to read in a paragraph of data
}
{
    for(i=1;i<=NF;i+=3)         # jump forward 3 fields at a time
        print $i,$(i+1),$(i+2)  # print 3 fields
}' file

答案 1 :(得分:1)


awk 'NR>1 && /^[0-9]/ {print substr(s,2); s=""} {s=s FS $0} END {print substr(s,2)}' file
  1. NR>1 && /^[0-9]/:如果一行不是第一行且以数字开头,
  2. {print substr(s,2); s=""}:在没有前导空格的情况下打印“ s”,然后清除它。
  3. {s=s FS $0}:在每一行上,将当前行附加到“ s”的值上。 FS默认为空格。

edit :添加了END条件以赶上最后一行,讨厌它,做出更好的单独答案。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed '/^[0-9]/{:a;N;s/\n\([^0-9]\)/ \1/;ta;P;D}' file

如果当前行以整数开头,请追加以下行。如果该行不是以整数开头,则用空格替换换行并重复。否则,打印/删除图案空间中的第一行并重复。

答案 3 :(得分:0)

使用awk使其更简单:

awk 'NF==2 {printf("%s ", $0); next} 1' file

基本上,“如果只有 个正好两个字段,则不要打印换行符。”