同じパターンが表示されるまで交差する線を接続する方法

同じパターンが表示されるまで交差する線を接続する方法

ファイルがあります:

 "p1"data
 "p2"data
 "p3"data
 "p1"data
 "p2"data
 "p3"data
 "p2"data
 "p3"data
 "p1"data
 

次の「p1」が表示されるまで、すべての行を「p1」にリンクしたいと思います。

 "p1"data"p2"data"p3"data
 "p1"data"p2"data"p3"data"p2"data"p3"data
 "p1"data
 

引用は文字通りの引用です。数千行の「p2」および「p3」入力ファイルセットが1〜10個ある場合があります。出力ファイルの長さは約600行でなければなりません。

試してみましたsed -e'/^"p1/N;s/\n//'が、何度も実行する必要があり、最終的に「p1」を他の「p1」と関連付けました。

どんな助けでも大変感謝します。ちなみに、このファイルはXMLファイルからのものです。 XMLツールがあることを知っていますがsed

ベストアンサー1

に基づいてこれ、GNUの使用(sed環境で利用可能なものがないと仮定):$POSIXLY_CORRECT

sed ':a;N;/\n"p1"/!s/\n//;ta;P;D' file

標準sed構文では、分岐ラベルの後にコメントを付けることはできず、N最後の行で実行するとパターンスペースが削除されるため、次のようにする必要があります。

sed -e :a -e '$!N;/\n"p1"/!s/\n//;ta' -e 'P;D' file

追加コメント:

sed '
  # Label to jump to:
  :a
  # Append next line to pattern space unless we are
  # on the last line:
  $!N
  # If the newline is NOT followed by "p1", append
  # the line by replacing the newline with a space:
  /\n"p1"/!s/\n//
  # If we changed something, jump to label:
  ta
  # Print part until newline
  P
  # Delete part until newline
  D' file

おすすめ記事