次のパターンまでこのパターンの後の2行ごとにマージ

次のパターンまでこのパターンの後の2行ごとにマージ

ファイル.txt

String1?
word1
word2
word3
word4

String2?
word5
word6
word7
word8

希望の出力:

String1?
word1 | word2
word3 | word4

String2?
word5 | word6
word7 | word8

私が試した唯一のパターンはlineです/?$/

sed '/\?$/{n;:l N;/\?$/b; :a; N; $!b a; s/\n\s\{1,\}/ | /g; bl}'

しかし、それはうまくいきませんでした。私の現在の作業ソリューション:

sed '/\?$/{:a;N;/\n....-..-.. /!s/\n/ - /;ta;P;D}' | sed 's/^[- ]*//g;s/[ -]*$//g'

...しかし、回避策であり、非常に遅い速度です。パイプなしのシングルライナーとクイックソリューションで役立つ人はいますか?

パターンのように空白行がなく、,$\|^$^$が存在せず、?$を含む他の行がある場合は、どのように?$から貪欲でない最初の?$パターンまでバッファを保存し、最後のAllを除いて印刷できますか? ? 1行だけ検索し、最後の行を次のパターンバッファとマージして検索しますか?

ベストアンサー1

GNU sed専用です。
ブロックのすべての行に正確に2つの列がある場合(あなたの場合):

sed '/?$\|^$/b;N;s/\n/ | /' File.txt

奇妙なコンテンツが可能な場合(一般的な方法):

sed '/?$\|^$/b;N;/\n$/!s/\n/ | /' File.txt

おすすめ記事