編集:最初にリクエストを明確にしなかったので申し訳ありません。実際、バックスラッシュエスケープ方式で作成された文字列にアクセスできず、より明確にするために例を修正しました。今得た2つの答えでは、最初に文字列にバックスラッシュを含める必要がありますが、そうではありません。
難しい文字を多く含むことができる文字列があり、二重引用符などで入力すると、同じ文字列が生成されるようにエスケープ方式でファイルに書きたいと思います。とPerlの機能を試してみましたが、そのecho -e
参照は異なります。perl
shell-quote
quotemeta
例:
# 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"'