時々、追加の改行を含む入力ファイルを読む方法は?

時々、追加の改行を含む入力ファイルを読む方法は?

ほとんどの場合、次のような入力ファイルを取得します。

java-1.8.0-openjdk.x86_64  1:1.8.0.232.b09-1.el6_10        asyum:ol6_latest
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.232.b09-1.el6_10        asyum:ol6_latest
kernel.x86_64              2.6.32-754.23.1.el6             asyum:ol6_latest

...whileループがあり、次のコードを使用して各行に対してfield1とfield2を正常にキャプチャできます。

f1=$(echo $line | awk '{print $1}')
f2=$(echo $line | awk '{print $2}')

ただし、時々、次のような入力ファイルが表示されます。

java-1.8.0-openjdk.x86_64  1:1.8.0.232.b09-1.el6_10        asyum:ol6_latest
java-1.8.0-openjdk-headless.x86_64
                           1:1.8.0.232.b09-1.el6_10        asyum:ol6_latest
kernel.x86_64              2.6.32-754.23.1.el6             asyum:ol6_latest

(ライン2を区切る追加の改行があることに注意してください。)

このタイプの入力をプログラムで処理するためのヒント/コツがあります(入力ファイルを手動でクリーンアップする代わりに)。

ベストアンサー1

以下は、先行スペースにのみ依存するソリューションです。予想されるフィールド数に依存しません。

これGNUマニュアルsed「空白で始まる行を連結する」方法を提供します。

sed -E ':a ; $!N ; s/\n\s+/ / ; ta ; P ; D'

マニュアルでは、移植可能な(GNUではない)バリアントは次のように主張しています。

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

おすすめ記事