web-dev-qa-db-ja.com

Sedコマンドの行末と$の照合中にエラーが発生しました

現在、シェルスクリプトを介してcshに以下のコマンドを適用しています。

sed -i "s/cb $i$/cb $i $cb/" */callback_events

どこ:

  • $i-変数の値i
  • $cb-変数cbの値
  • $-行末に一致させるため

ただし、上記のコマンドで次のエラーが表示されます。

Variable name must contain alphanumeric characters.

私の現在のシェルは/bin/cshです。

1
Karan Shah

二重引用符で囲まれた文字列内で文字$を表す場合、引用符で囲む必要があります。そうでない場合、シェルは変数展開を導入すると考え、その後の文字がアルファベットまたは特殊変数のいずれでもない場合は不満になります。

sed -i "s/cb $i\$/cb $i $cb/" */callback_events

ここには、2つのレベルの文字解釈があります。

  1. 最初に、シェルはコマンドを読み取り、そのルールを適用します。ルールの1つは、二重引用符内で$が引用されていない限り、変数展開を導入することです。

  2. シェルが終了すると、コマンドは次のようになります。

    sed -i s/cd <value-of-i>$/cd <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...
    

    引用符はなくなり、$i$cbはそれぞれの値に置き換えられ、\$$になりました。また、*/callback_eventsはファイルのリストに置き換えられました。

  3. これはsedに渡され、itsルールが適用されます。これらのルールの1つは、検索パターンの末尾にある$は行末を意味することです。

4
AlexP

私はUbuntu Studio 18を使用しています$エラーは「bash expansion」によるものです。$ 0 vs $(0)vs "$ 0"を実行するとエラーが発生します

Sedスクリプトの行末をシークする代わりにすべてを見つけて&変数を使用を追加します。次のように使用されます:

echo "this was here" | sed -e 's_.*_& YOURFOOBAR_'

Sedスクリプトを学習している場合は、^を使用してホームキーのようにフロントを探し、;文字を使用して複数のsedコマンドを追加できます。ここでは、代わりのsedスクリプトコマンド「s ///」に「_」または「/」を同じ意味で使用しています

echo "this was here" | sed -e 's/^/PREFIXEDTEXT /;s_.*_& SUFFIXEDTEXT_'

注:テストコマンドは、エイリアス[= testのようにエイリアスされるため、bash拡張で問題が発生すると考えられます。 &|のようなman bashを参照してくださいいけない。

最後に、ここで学習しようとするのではなく、ebayから本を購入することをお勧めします。

1
openInvent