最終行が不完全のファイルをsedで置換すると最終行が無くなる

事の発端は、Oracleのバインド変数をシェルスクリプトで置換させてから
処理しようとしたとき。

cat 元のファイル | sed s/バインド変数/バインド変数の値/g > ${sql_file}

として、

sqlplus -s user/password@sid < ${sql_output}
set ...
set ...

@${sql_file}

exit
SQL

で実行したら、出力ファイルが空になった。。。あらっ、と思って調べると最後の一行が無くなって、";"で終っていなかったのが原因らしい。元のファイルを vi で開いてみたら、「最終行が不完全です」と警告が。。

なので、適当なファイルで実験。hoge.txtを、

$ cat hoge.txt
aa
aaa;$ (←"$"は次のコマンドプロンプト)

と作成して、viで開くと

$ vi hoge.txt
aa
aaa;
~
~
"hoge.txt" [最終行が不完全] 2 行、8 バイト

と表示されるこのファイルをsedで置換すると

$ cat hoge.txt | sed s/a/b/g
bb

となってしまって、復帰改行が入っていないと駄目らしい。

$ echo | cat hoge.txt - | sed s/a/b/g 

とすれば、ちゃんとしたファイルの場合、余計な改行が入ってしまうけど今のところはこれで良いとする。