sed は比較的簡単にテキストデータの加工ができて大変重宝するツールですが、複数行マッチさせて何か処理するという際にちょっと困ってしまったのでメモ。
GNU sed (Linux)
sh
sed -r "/.+:/N;s/(.+:.*)\n(.*)/\1\2/g" sample.txt
BSD sed (Mac, UNIX)
sh
sed -E "/.+:/N;s/(.+:.*)\n(.*)/\1\2/g" sample.txt
これで、最初のパターン「.+:」にマッチする対象行を次の行と連結できます。
正しい動作を理解しているわけではないのですが、「N」を指定して直前の条件式にマッチする対象行の次の行をパターンスペースに追加して、対象行と次の行の2行に対して置換しているイメージです。
ただし、あくまでも次の行のみなので、間に空行を含む場合等ではさらに工夫が必要です。
例えば次のようなデータの場合、
sample.txt
AAA:
200
BBB:
100
下記のようになります。
AAA: 200
BBB: 100