如何在bash中反转转义反斜杠编码,如"\"和"\ 303\266"?

Ror*_*ory 3 linux bash encoding escaping character-encoding

我有一个脚本,记录UTF8编码名称的文件.但是,脚本的编码/环境设置不正确,它只是重新编码原始字节.我现在在文件中有很多行,如下所示:

.../My\ Folders/My\ r\303\266m/...
Run Code Online (Sandbox Code Playgroud)

所以在文件名中有空格\和UTF8编码的东西就像\303\266(是ö).我想反转这种编码?是否有一些简单的bash命令行命令可以链接在一起删除它们?

我可以获得数百万个sed命令,但是需要很长时间才能列出我们拥有的所有非ASCII字符.或者开始在python中解析它.但我希望我能做到一些技巧.

Pau*_*ce. 5

这是对Unicode字符的粗略抨击:

text="/My\ Folders/My\ r\303\266m/"
text="echo \$\'"$(echo "$text"|sed -e 's|\\|\\\\|g')"\'"
# the argument to the echo must not be quoted or escaped-quoted in the next step
text=$(eval "echo $(eval "$text")")
read text < <(echo "$text")
echo "$text"
Run Code Online (Sandbox Code Playgroud)

这利用$'string'了Bash 的引用功能.

这将输出"/ My Folders /Myröm/".

从Bash 4.4开始,它就像:

text="/My Folders/My r\303\266m/"
echo "${text@E}"
Run Code Online (Sandbox Code Playgroud)

这使用了Bash的一个新功能,称为参数转换.在E操作者使待处理的参数,如同其内容物内$'string',其中反斜线序列,在这种情况下八进制值,进行评估.


Ror*_*ory 1

最后我用了这样的东西:

cat file | sed 's/%/%%/g' | while read -r line ; do printf "${line}\n" ; done | sed 's/\\ / /g'
Run Code Online (Sandbox Code Playgroud)

有些文件%中包含 printf 特殊字符,因此我必须将其“加倍”,以便将其转义并直接通过。in-r停止read读取转义\s 但读取不会变成"\ "" "所以我需要最后的sed

  • 如果您使用 `printf "%b\n" $line` 那么它不会解释 $line 中的 `%`。 (2认同)