sedを使用してエスケープ文字を含む文字列を追加する

sedを使用してエスケープ文字を含む文字列を追加する

現在私は以下を使用しています:

sed -i -e "5a\\
${text}" $filename

変数テキストに "\epsilon"などの文字列を含む特定の行に項目を追加します。

使用するとき

echo -E $text

文字列はよく表示されますが、 に渡された文字列から拡張すると、sedすべてのエスケープ文字が拡張され、結果は私が望むものとは異なります。

何もエスケープせずに文字列の生の内容を使用するようにsedをどのように取得できますか?

答え1

sedコマンドはa\エスケープ文字を解釈するため、挿入する文字列にバックスラッシュを繰り返す必要があります。この試み:

sed -e "5a\\
$(echo -E "$text" | sed -e 's/\\/\\\\/g')"

答え2

引用は難しいです。 awkやPerlなど、余分な引用符を必要としないツールを使用することをお勧めします。これら2つのツールを使用すると、コマンドラインまたは環境を介して引数を渡し、それをテキスト操作に使用できます。パールの使用:

export text
perl -i -pe '$_ .= "$ENV{text}\n" if $. == 5' "$filename"

awkでは、ファイルを手動で移動する必要があります。

tmp=$(TMPDIR=$(dirname -- "$filename") mktemp)
awk -v text="$text" '{print} NR==5 {print text}' <"$filename" >"$tmp" &&
mv -- "$tmp" "$filename"

答え3

通常、escapingを使用できますprintf "%q"。以下を試してください。

text='\epsilon'
echo -e "$text"
silon

そして%q

text=$(printf "%q" '\epsilon')
echo -e "$text"
\epsilon

答え4

私はsedの専門家ではないので、echoを使用して説明する方が簡単だと思います。

二重引用符の代わりに一重引用符を使用してください。

例1:

echo "one\\two"
one\two

例2:

echo 'one\two'
one\two

したがって、example2方式を使用すると、何も逃げる必要はありません。単一引用符 's\t\r\i\n\g' で囲まれた文字列は、そのまま解釈されます。 (\ 文字はエスケープ文字として使用できません)

源泉:一つ

関連情報