BASH:unescape字符串

BASH:unescape字符串,bash,Bash,假设我有以下字符串: "some\nstring\n..." 它在bash中显示为一行。此外 string_from_pipe | sed 's/\\\\/\\/g' # does not work | awk '{print $0}' | awk '{s = $0; print s}' | awk '{s = $0; printf "%s",s}' | echo $0 | sed 's/\\(.)/\1/g' # all have not worked. 如何取消此字符串的缩放,使其

假设我有以下字符串:

"some\nstring\n..."
它在bash中显示为一行。此外

string_from_pipe | sed 's/\\\\/\\/g' # does not work
| awk '{print $0}'
| awk '{s = $0; print s}'
| awk '{s = $0; printf "%s",s}'
| echo $0  
| sed 's/\\(.)/\1/g'
# all have not worked. 
如何取消此字符串的缩放,使其打印为:

some
string

甚至在文件中以这种方式显示?

正如您所观察到的,
echo
并不能解决问题:

$ s="some\nstring\n..."
$ echo "$s"
some\nstring\n...
你没有提到你从哪里得到的字符串,或者里面有哪些转义符

使用符合POSIX标准的shell的
printf
如果转义是受
printf
支持的转义,请尝试:

$ printf '%b\n' "$s"
some
string
...
使用sed 使用awk
如果变量中有字符串(例如
myvar
),则可以使用:

${myvar//\\n/$'\n'}
例如:

$ myvar='hello\nworld\nfoo'
$ echo "${myvar//\\n/$'\n'}"
hello
world
foo
$ 
(注意:如果您不能完全控制
的内容,则使用
printf%s
通常比使用
echo
更安全)

sh仅用于此目的:

s='some\nstring\n...'
printf '%b\n' "$s"
…将发出:

some
string
...

更重要的是,的应用程序使用部分明确建议为此目的使用
printf%b
,而不是依赖可选的XSI扩展。

如何使用
echo的
-e
选项

$ s="some\nstring\n..." && echo -e "$s"
some
string
...
echo


你从哪里弄到这根绳子的?它是脚本中的一个文本吗?它是我从cpp程序输出的一个字符串,用于转义所有控制字符。这是带有转义字符串的
head-n1 my_file_的输出。
?@BenjaminW。我不能复制粘贴字节。可以这样说,它是一个由引号包围的字符串,采用文字格式:
“一些\n用这些\t\t类型的东西\n \t串”
这是不可能的。管道的不同部分在不同的子shell中运行,因此它们看不到彼此的变量。(cc:@Matts)转义只是反斜杠,是从cpp代码输出的;这是行不通的(被难住了)。从一家公司得到的pipe@bordeo“不起作用”太含糊了,没有帮助。很明显,它在您的示例字符串上对我有效。使用相同的命令运行相同的字符串,得到的结果是相同的还是不同的?如果不同,它到底有什么不同?我得到了确切的“一些\n字符串”――字面意思。@bordeo如果应用正确,这是有效的。您是如何将此解决方案应用于您的案例的?@bordeo请运行
键入printf
并告诉我们打印的内容。收到:
cat…|xargs printf“%b\n”
这不是很理想
printf'%b\n'$(为了参数起见,假设我需要使用xargs运行printf。以下是稳定的吗?
。|xargs-I{}printf'%b\n'{}
@donlan“稳定的”,因为它的输出不会意外更改?是的。“正确的。”“,因为它在每一行输入上运行
printf“%b\n”
转换,而不首先咀嚼该输入?否。请参阅中给出的示例,说明使用
xargs
调用
printf“%b\n”
;只有使用
xargs-0
xargs-d$'\n'
的输出正确。(顺便说一句,如果你把那条评论转化为自己的问题,或者我不介意的话,这可能是一个很好的答案).
echo-e
是在输出时打印
-e
;此应答文档中的bash行为不符合要求,可以在编译时或运行时关闭。使用
printf'%b\n'$s更可靠
相反,它在所有兼容POSIX的shell上的工作方式都是相同的。另请参见Stephane在问题中给出的精彩答案。
some
string
...
$ s="some\nstring\n..." && echo -e "$s"
some
string
...
  -e    enable interpretation of the following backslash escapes
  [...]
      \a    alert (bell)
      \b    backspace
      \c    suppress further output
      \e    escape character
      \f    form feed
      \n    new line
      \r    carriage return
      \t    horizontal tab
      \v    vertical tab
      \\    backslash
      \0nnn the character whose ASCII code is NNN (octal).  NNN can be 0 to 3 octal digits
      \xHH  the eight-bit character whose value is HH (hexadecimal).  HH can be one or two hex digits