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中解析它.但我希望我能做到一些技巧.
这是对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',其中反斜线序列,在这种情况下八进制值,进行评估.
最后我用了这样的东西:
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。