Edited at

sed で特定行の改行を削除する

More than 1 year has passed since last update.

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