現在、シェルスクリプトを介してcsh
に以下のコマンドを適用しています。
sed -i "s/cb $i$/cb $i $cb/" */callback_events
どこ:
$i
-変数の値i
$cb
-変数cbの値$
-行末に一致させるためただし、上記のコマンドで次のエラーが表示されます。
Variable name must contain alphanumeric characters.
私の現在のシェルは/bin/csh
です。
二重引用符で囲まれた文字列内で文字$
を表す場合、引用符で囲む必要があります。そうでない場合、シェルは変数展開を導入すると考え、その後の文字がアルファベットまたは特殊変数のいずれでもない場合は不満になります。
sed -i "s/cb $i\$/cb $i $cb/" */callback_events
ここには、2つのレベルの文字解釈があります。
最初に、シェルはコマンドを読み取り、そのルールを適用します。ルールの1つは、二重引用符内で$
が引用されていない限り、変数展開を導入することです。
シェルが終了すると、コマンドは次のようになります。
sed -i s/cd <value-of-i>$/cd <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...
引用符はなくなり、$i
と$cb
はそれぞれの値に置き換えられ、\$
は$
になりました。また、*/callback_events
はファイルのリストに置き換えられました。
これはsed
に渡され、itsルールが適用されます。これらのルールの1つは、検索パターンの末尾にある$
は行末を意味することです。
私は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から本を購入することをお勧めします。