現在私は以下を使用しています:
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' で囲まれた文字列は、そのまま解釈されます。 (\ 文字はエスケープ文字として使用できません)
源泉:一つ