ファイルの両方の行が特定のパターンと一致する場合、どのようにリンクしますか?

ファイルの両方の行が特定のパターンと一致する場合、どのようにリンクしますか?

複数の行を含むファイルがありますが、すべて特定のパターンと一致する場合はリンクしたいと思います。

以下を使用して、パターンに合った行を見つけて、次の行を取得できることを知っています。

grep -E -A1 'Pattern' filename

しかし、次の行もパターンと一致するかどうかを確認し、2行をどのようにリンクしますか?

たとえば、次のようなファイルがあります。

Hello
i
am
John
Smith

例示的なパターンは以下の通りである。

'^[A-Z][a-z]+'

したがって、この場合はすべて大文字で始まる行をマージしたいと思います。

私が達成したい結果は次のとおりです。

Hello
i
am 
John Smith

ベストアンサー1

/^[A-Z][a-z]+/{
  :a
  N
  /\n[A-Z][a-z]+/{
    s/\n/ /
    b a
  }
}

別の名前で保存しjoin.sedて実行してくださいsed -Ef join.sed file

行がパターンと一致する場合は、パターン空間に次の行を追加し、行もパターンに一致する限り、改行を空白に置き換えるループを開始します。

GNU Sedの場合は、1行に縮小できます。

sed -E '/^[A-Z][a-z]+/{:a;N;/\n[A-Z][a-z]+/{s/\n/ /;b a}}' file

join.awkまたは、パターンが次のようになる必要があるAwkスクリプトp

{
    if($0~p)c+=1
    else c=0
    printf "%s%s", (c>1 ? " " : ors), $0
    ors=ORS
}
END{print ""}

実装する: awk -f join.awk p='^[A-Z][a-z]+' file

おすすめ記事