[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

7. バグの報告

バグの報告はbug-gnu-utils@gnu.orgに電子メールを送ってください. Subject:フィールドのどこかに,単語"sed"を含めてください.また, 可能であれば,報告の内容にsed --versionの出力も含めてください.

以下のようなバグの報告を送らないでください.

 
while building frobme-1.3.4
$ configure 
error--> sed: file sedscr line 1: Unknown option to 's'

GNU sedでお気に入りのパッケージをコンフィグレーションできない場合, 特定の問題を確認するために時間をかけ,スタンドアローンのテストケースを 作成してください.Cコンパイラのようなその他のプログラムとは異なり, sedに対してそのようなテストケースを作成することはまったく単純 です.

スタンドアローンのテストケースには,テストを実行するために必要なすべて のデータと,問題を生じたsedの呼び出しで指定したものを含めてく ださい.スタンドアローンのテストケースは小さい方が良いでしょう.テスト ケースは,"frobme-1.3.4のコンフィグレーションを試みた"というような, sed からかけ離れているものを必要とすべきではありません.そう です,それはバグを探す情報として原則的には十分ですが,見通しはあまり現 実的ではありません.

以下は一般的なバグやバグではないもので報告されているものです.

最後の行のNコマンド

sedのほとんどのバージョンは,Nコマンドがファイルの リストの最後に出力されるとき,何も出力せずに終了します.GNU sed-nコマンドスイッチが指定されていない限り,終了前にパターンス ペースを出力します.この選択は設計されたものです.

例えば,以下の動作を考えます.

 
sed N foo bar

これは,fooが偶数または奇数の行があるかどうかに依存します(10).または,パターンにマッチした後 に続く数行を読み込むスクリプトを書いているとき,伝統的なsedの 実装では,以下のように書くことが強制されます.

 
/foo/{ $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N }

以下の代わりです.

 
/foo/{ N;N;N;N;N;N;N;N;N; }

いずれにせよ,もっとも単純な回避方法は,伝統的な動作に依存するスクリプ トで$d;Nを使用すること,または,POSIXLY_CORRECT変数を空で はない値に設定することです.

正規表現の構文の破壊

sedは,POSIXの基本正規表現の構文を使用しています.標準に よると,エスケープシーケンスの意味はこの構文では未定義です. sedで有名なものは,\|\+\?\\\<\>\b\B\w,そして\Wです.

POSIXの基本正規表現を使用しているすべてのGNUプログラムでは, sedはこれらのエスケープシーケンスを特殊文字として解釈します. そのため,x\+は一つ以上のxの出現にマッチします. abc\|defabcまたはdefにマッチします.

この構文は,他のsedに対して書かれたスクリプトを実行するとき問 題になるかもしれません.sedプログラムには,\|\+がリテラル文字の|+にマッチするという仮定を用い て書かれているものもあります.そのようなスクリプトを, GNU sedのような近代的なsedを実装している ものを用いて使用する場合,偽のバックスラッシュを削除して修正する必要が あります.

更に,このバージョンのsedは,印刷不可能な文字(マルチバイト文 字を含む)をスクリプトに挿入するため,いくつかのエスケープ文字 (\a\c\d\o\r\t\v\x)をサポートしています.これらは,他のsed に対して書かれているスクリプトで同様な問題を生じるでしょう.

-iで読み込み専用のファイルを破壊する

手短に言うと,sed d -iでは読み取り専用のファイルの内容を削除し, 一般的に-iオプション((see section Invocation)では保 護されたファイルを破壊します.これはバグではありませんが,Unixファイル システムで動作する方法に影響します.

ファイルへの許可はファイルのデータに生じる可能性があることを告げていま すが,ディレクトリの許可はディレクトリのファイルのリストに生じる可能性 があることを告げています.sed -iは書き込み属性でディスクに存在し ているファイルを開きませんが,最終的にはオリジナルファイル名に名前を変 更する一時的なファイルで作業します.ファイルの名前を変更したり削除した りする場合,実際にはディレクトリの内容を編集していることになるので,そ の処理はファイルではなくディレクトリの許可に依存します.同じ理由で, sedは読み込み専用のディレクトリの書き込み可能なファイルで `-i'を使用しません(しかし,信じられないことにバグとして報告して きた人はいません…).

0aは動作しません(エラーになります)

行0はありません.0は特殊なアドレスで,スクリプトの開始時にアクティブに するため,`0,/RE/'のように処理するためだけに使用されます. `1,/abc/d' と書き,最初の行に単語`abc'が含まれている場合,ア ドレス範囲は(ファイルの終わりでなければ)少なくとも二行必要なので,マッ チは無視されます.しかし,期待することは,`abc'を含んでいる行が最 初に見つかるまで,すべての行を削除することなので,これは `0,/abc/d'で実行されます.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on October, 5 2005 using texi2html 1.70.