sedで変数文字列を特殊文字に置き換える方法[重複]

sedで変数文字列を特殊文字に置き換える方法[重複]

ファイルの内容をより簡単にバッチ変更できるように、sedを使用してファイルのテキストを置き換え始め、必要な各値をBASHの変数に設定し、すべての変数を呼び出して既存の項目を置き換える関数に置き換えを設定しました。テキスト。はい〜

sed -i -e "s/$answer/$FORME $answer/g" ~$answer.txt

$answerは端末からのコマンド入力のための変数です。 $ FORMEは$ answer入力に基づいて定義された変数です。$ FORMEに "/"が含まれています。オンラインで検索してみると、特殊文字を含む変数置換を使用する方法が見つかりません。特殊文字を使用して$ FORMEを生成する$ answerのコマンドを使用しようとすると、次のエラーが表示されます。

sed: -e expression #1, char 15: unknown option to `s'

私は、これが$ FORMEの特殊文字が置き換えられる文字列ではなく、実際のコマンドの一部として登録されることを意味すると仮定します。助けてください!

よろしくお願いします!

答え1

sコマンド区切り文字として任意の文字を使用できます。たとえば、次のようになります。

sed -i -e "s|$answer|$FORME $answer|g" ~$answer.txt

答え2

この質問がStack Exchangeで質問され回答されたことは驚くべきことですが、一般的に役立つ2つの答えは、非常に合法的な質問に対して干し草の山で針を見つけることと同じです。彼らは:

1. 変数で可能な特殊文字 4 個だけをエスケープします。

指摘したとおりここ(この質問は一般的な質問に対するSEの嫌悪感の犠牲ですが)sedコマンドの代替部分で特殊と見なされる文字はs、、改行\および&区切り記号です(通常/は実際には何でも構いません)。

したがって、sedで任意の変数を代替変数として使用するには、まず次のように4つの文字がすべて表示されることをエスケープします。

REPL='Arbitrary variable potentially with special characters like / and & and \ and 
newline\
newline2'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
hexdump -C <<< "$REPL"

たとえば、

REPL='/&\ 
newline'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
sed "s/x/$REPL/" <<< "STARTxEND"

生産する:

START/&\ 
newlineEND

予想通り。

2.同等のツールを使用して代替変数を文字通り解釈します。

perl引用する)には、変数(エクスポートまたは呼び出し回線に設定して環境の一部になる限り)が一流の市民であるため、この機能があります。\Q代替文字列にはコメントは必要ありません(ただし正規表現文字列には便利です)。

export REPL='/&\ 
newline'
perl -pe 's/x/$ENV{REPL}/' <<< "STARTxEND"

生産する:

START/&\ 
newlineEND

awk、しかし引用する、確かに。

関連情報