将所有反斜杠转义序列可产生的字符替换为其转义转义序列

将所有反斜杠转义序列可产生的字符替换为其转义转义序列

编辑:我很抱歉,我最初没有明确我的要求。我实际上无法访问以反斜杠转义方式编写的字符串,并且修改了示例以使其更清晰。我现在得到的两个答案要求我在字符串中首先包含反斜杠,但事实并非如此。

我有一个可能包含很多困难字符的字符串,我想以转义方式写入文件,这样如果用双引号给出 , 等,它会生成相同的字符串。echo -eperl尝试使用shell-quoteand 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"'

相关内容