如何在bash中反转“\”和“\ 303 \ 266”这样的转义反斜杠ecodings?

我有一个用UTF8编码名称logging文件的脚本。 但是脚本的编码/环境没有正确设置,只是logging了原始字节。 我现在在文件中有很多行,像这样:

.../My\ Folders/My\ r\303\266m/... 

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

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

这里是对Unicode字符的一个粗略的描述:

 text="/My\ Folders/My\ r\303\266m/" text="echo \$\'"$(echo $text|sed -e 's|\\|\\\\|g')"\'" text=$(eval "echo $(eval $text)") read text < <(echo $text) echo $text 

这使用了Bash的$'string'引用特性。

这会输出“/ My Folders / Myröm/”。

目前还不清楚究竟是使用什么样的逃跑。 八进制字符代码是C,但是C不能逃脱空间。 空格转义用在shell中,但不使用八进制字符转义。

使用命令printf %b $escaped可以撤销接近C风格转义的东西。 (文档说八进制转义以\0开头,但是似乎并不需要GNU printf。)另一个答案提到read逃避外壳转义,尽管如果空间是唯一不是由printf %b处理的用sed处理这个案子可能会更好。

最后我用了这样的东西:

 cat file | sed 's/%/%%/g' | while read -r line ; do printf "${line}\n" ; done | sed 's/\\ / /g' 

有些文件中有% ,这是一个printf特殊字符,所以我必须“加倍”,这样它才能被转义并直接通过。 read-r停止读取转义的,然而读取不转换成" " ,所以我需要最后的sed

使用printf解决UTF-8文本的问题。 使用read来照顾空间(\ )

喜欢这个:

 $ text='/My\ Folders/My\ r\303\266m/' $ IFS='' read t < <(printf "$text") $ echo "$t" /My Folders/My röm/ 

内置的“读取”功能将处理部分问题:

 $回声“与\空间”| 而读r; 做echo $ r;  DONE
与空间

将文件(逐行)传递给下面的perl脚本。

 #!/usr/bin/per sub encode { $String = $_[0]; $_ = $String; while(/(\\[0-9]+|.)/g) { $Match = $1; if ($Match =~ /\\([0-9]+)/) { $Code = oct(0 + $1); $Char = ((($Code >= 32) && ($Code 160)) ? chr($Code) : sprintf("\\x{%X}", $Code); printf("%s", $Char); } else { print "$Match"; } } print "\n"; } while ($#ARGV >= 0) { $File = shift(); open(my $F, ") { $String =~ s/\\ / /g; &encode($Line); } } 

喜欢这个:

 $ ./PerlEncode.pl Test.txt 

其中Test.txt包含:

 /My\ Folders/My\ r\303\266m/ /My\ Folders/My\ r\303\266m/ /My\ Folders/My\ r\303\266m/ 

行“$ String =〜s / \ / / g;” 用“”替换“\”,用子编码解析那些unicode字符。

希望这个帮助