2

の GNU 実装を使用して書かれたと思われる sh スクリプトを のsedBSD 実装に移植していsedます。元のコメントを含むスクリプト内の正確な行は次のとおりです。

# escape dot in file extension to grep it
ext="$(echo $ext | sed 's/\./\\./' -)"

次の結果を再現できます(明らかに、すべての可能性のある値を使い果たしているわけではありませんext):

ext=.h; ext="$(echo $ext | sed 's/\./\\./' -)"; echo [$ext]

GNU の実装を使用するとsed、以下が返されます。

[\.h]

以下の BSD の実装を使用するとsed、以下が返されます。

sed: -: No such file or directory
[]

の両方の実装に対してext=.h; ext="$(echo $ext | sed 's/\./\\./')"; echo [$ext]リターンを実行します。[\.h]sed

GNU と BSD の両方sedのマニュアル ページを調べましたが、末尾の「-」については何も見つかりませんでした。「-」でグーグル検索しsedてもあまり実りがありません。

「-」はタイプミスですか?の予期しない値に必要な「-」はあり$extますか? 問題はsedではなく にありshますか?

誰かが私が見るべきものに私を導くことができますか、それとも「-」の目的が何であるかを説明することはできますか?

4

2 に答える 2

1

私のシステムでは、その構文は man ページに記載されていませんが、'info' ページにあります。

sed オプション... [スクリプト] [入力ファイル...]

INPUTFILE を指定しない場合、または INPUTFILE が-',sed の場合は、標準入力の内容がフィルター処理されます。

その特定の使用法を考えると、「-」を省略しても機能すると思います。

于 2013-02-08T21:31:29.293 に答える
0

特定の質問に回答しましたが、スクリプトはすべて間違っています。これを見てください:

# escape dot in file extension to grep it
ext="$(echo $ext | sed 's/\./\\./')"

その主な問題は次のとおりです。

  1. 変数 ($ext) を引用していないため、ファイル名の展開が行われ、スペースが含まれている場合は、1 ではなく複数の引数として echo に渡されます。代わりに、次のようにします。

    ext="$(echo "$ext" | sed 's/\./\\./')"
    
  2. 外部コマンド (sed) とパイプを使用して、シェル自体が簡単に実行できることを実行しています。代わりにこれを行います:

    ext="${ext/./\.}"
    
  3. 最悪なのは、変数内の RE メタ文字 (.) をエスケープしているため、それを grep に渡して、文字列であるかのように RE 検索を行うことができます。これは意味がなく、扱いにくくなります。一般的に、変数に RE メタ文字の任意の組み合わせを含めることができます。RE検索の代わりに文字列検索を行うだけで、何もエスケープする必要はありません。上記の置換コマンドのいずれも実行せず、代わりに次のいずれかを実行しますgrep "$ext" file

    grep -F "$ext" file
    fgrep "$ext" file
    awk -v ext="$ext" 'index($0,ext)' file
    
于 2013-02-09T01:13:50.020 に答える