バックスラッシュエスケープシーケンスで生成できるすべての文字を対応するエスケープシーケンスに置き換えます。

バックスラッシュエスケープシーケンスで生成できるすべての文字を対応するエスケープシーケンスに置き換えます。

編集:最初にリクエストを明確にしなかったので申し訳ありません。実際、バックスラッシュエスケープ方式で作成された文字列にアクセスできず、より明確にするために例を修正しました。今得た2つの答えでは、最初に文字列にバックスラッシュを含める必要がありますが、そうではありません。

難しい文字を多く含むことができる文字列があり、二重引用符などで入力すると、同じ文字列が生成されるようにエスケープ方式でファイルに書きたいと思います。とPerlの機能を試してみましたが、そのecho -e参照は異なります。perlshell-quotequotemeta

例:

# I have a file containing difficult characters:
$ cat text
line0'field0
line1   field1"
$ cat -v text
line0'field0
line1   field1"

二重引用符を含む予想生出力:

"line0'field0\nline1\tfield1\""

すでに組み込みのソリューションがあると確信しています。

答え1

修正されたフレーズに返信する

心に浮かぶ(そして広く使われている)唯一のツールはですが、sedまさにきれいではありません。

sed ':a;N;$!ba;s/\n/\\n/g;s/\t/\\t/g'

だから...

$ cat file
line0'field0
line1   field1"
$ sed ':a;N;$!ba;s/\n/\\n/g;s/\t/\\t/g' file
line0'field0\nline1\tfield1"  

感謝の言葉:https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed

元の声明に返信

質問を正しく理解したら、あなたは次のようなものを探していると思います(これはbashにあります。):

$ doublequoted="line0'field0\nline1\tfield1\""
$ foo="$(echo -e "${doublequoted//\\/\\\\}")"
$ echo $foo
line0'field0\nline1\tfield1"

私が間違って理解した場合は、何を探しているのかを明確にしてください。

答え2

Bashの場合は組み込みを使用できます。文字printfに注意してください。%

doublequoted="line0'field0\nline1\tfield1\"%s"
printf -v interpreted "${doublequoted//%/%%}"

それから

$ declare -p doublequoted interpreted
declare -- doublequoted="line0'field0\\nline1\\tfield1\"%s"
declare -- interpreted="line0'field0
line1   field1\"%s"

$ printf "%s" "$interpreted" | od -c
0000000   l   i   n   e   0   '   f   i   e   l   d   0  \n   l   i   n
0000020   e   1  \t   f   i   e   l   d   1   "   %   s
0000034

更新された要件に合わせて編集

$ cat text
line0'field0
line1   field1"

$ cat -A text           # show tabs
line0'field0$
line1^Ifield1"$

$ contents=$(< text)    # slurp the file contents into a var

$ printf -v escaped '%q' "$contents"    # "shell-escape" it

$ echo "$escaped"                       # it's in ANSI-C quoted form
$'line0\'field0\nline1\tfield1"'

$ echo "${escaped#$}"                   # output as requested
'line0\'field0\nline1\tfield1"'

関連情報