ほとんどの場合、次のような入力ファイルを取得します。
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'