スペースで区切られたテーブルに複数行のデータを出力するプログラムがあります。この出力をセミコロンで区切られたリストに変換する必要があります。
これはサンプル記録です。各フィールドには特定の数の文字があり、特定の数のスペースで埋められますが、フィールドの文字数とパディングスペースは、次のようにフィールドによって異なります。
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD.WithSpace....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
一般的に、次のことを行うには問題はありません。
command | tr -s ' ' ';'
理想的には、次のような結果を生成します。
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
ただし、上記のようにフィールド自体にスペースを含めることができ、問題を複雑にするために引用符なしで印刷されます。それでは上記のコマンドを実行してみてください"tr -s '';'"このコマンドは実際には次のことを行います。
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD;WithSpace;<etc>
^ <-- Problem here :(
値にスペースを含むフィールドを削除せずに、このデータからセミコロンで区切られたリストを作成する方法は一生不明です。誰もがこの問題を解決する方法を知っていればいいでしょう!
答え1
まず、すべてのフィールド値を前処理し、フィールド形式を検出して正規表現に変換し、区切り文字を追加する前にテキストを正規化する必要があると思います。
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD 7xxx <etc>
正規表現フィールド形式:
(FIELD[\s\dx]+)
==>使用sed/アッ...新しいフィールド形式で更新されました==>区切り文字が追加されました。