パイプで区切られたファイルがあり、ファイルを1行ずつ読み、各行で閉じていない引用符( ")を検索して閉じます。

パイプで区切られたファイルがあり、ファイルを1行ずつ読み、各行で閉じていない引用符( ")を検索して閉じます。

以下は、「20」を「20」で閉じる必要がある行です。

2019-02-15T10:25:19+0100|ttt|werewrw|erewr|fddsfsdf|dfsdf|07|2ee7|1b65d04|"20|19|-02-|15t10:03|45435435|765767||SIP;rr=200;text="hyt"|

答え1

これをテストファイルとして試してみましょう。

$ cat text
start|10|"20|end
"10"|"20|"30"|end
"20|"10|"30|end
abc|def|"20"|30|"end

開いているすべての項目を閉じるには、"以下を試してください。

$ sed -E 's/^("[^"|]*)\|/\1"|/; :a; s/(\|"[^"|]*)\|/\1"|/g; ta; s/\|"[^"|]*$/&"/' text
start|10|"20"|end
"10"|"20"|"30"|end
"20"|"10"|"30"|end
abc|def|"20"|30|"end"

どのように動作しますか?

閉じていない引用符が最初のフィールド、中間フィールド、または終了フィールドに表示される場合は、考慮する必要がある3つの状況があります。したがって、3つの代替コマンドがあります。

  • s/^("[^"|]*)\|/\1"|/

    行が引用符で始まり、最初の引用符の前に引用符がない場合は、|引用符が追加されます。

  • :a; s/(\|"[^"|]*)\|/\1"|/g; ta;

    中間フィールドに引用符がない場合は、引用符が追加されます。不足している引用符がすべて追加されたことを確認するために、変更がなくなるまで置換コマンドが繰り返されます。

  • s/\|"[^"|]*$/&"/

    最後のフィールドに閉じる引用符がない場合は、そのフィールドが追加されます。

関連情報