编辑:我很抱歉,我最初没有明确我的要求。我实际上无法访问以反斜杠转义方式编写的字符串,并且修改了示例以使其更清晰。我现在得到的两个答案要求我在字符串中首先包含反斜杠,但事实并非如此。
我有一个可能包含很多困难字符的字符串,我想以转义方式写入文件,这样如果用双引号给出 , 等,它会生成相同的字符串。echo -e
我perl
尝试使用shell-quote
and perl 的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"'