如何解码 bash 中的 \u003d 转义?

How to decode \u003d escape in bash?

我有一些字符串,例如:

dimension\u003d1920x1024:format\u003djpg

在一个文件中。我想解码它们,使它们看起来像:

dimension=1920x1024:format=jpg

我知道:

$ echo -e dimension\u003d1920x1024:format\u003djpg
dimensionu003d1920x1024:formatu003djpg
$ echo -e 'dimension\u003d1920x1024:format\u003djpg'
dimension=1920x1024:format=jpg
$ echo -e "dimension\u003d1920x1024:format\u003djpg"
dimension=1920x1024:format=jpg

所以我尝试了这个来得到我想要的:

$ cat file | xargs -L1 echo -e
dimensionu003d1920x1024:formatu003djpg

但是如您所见,它不起作用。我怎样才能让它工作?如何让 xargs 将参数传递给 echo,就像它们被引用一样?

这是对 ruby 的尝试,其中将更改写入文件

$ cat ./file
dimension\u003d1920x1024:format\u003djpg
dimension=800x600:format\u003djpg

上面的示例更加真实。

$ cat ./script.rb
#!/usr/bin/ruby
contents=File.read("#{ARGV[0]}")
file=File.open("#{ARGV[0]}","w")
if file
file.syswrite(contents.gsub(/\[uU]\{?([0-9A-F]{4})\}?/i) { .hex.chr(Encoding::UTF_8) })
file.close()
else
puts "No file with name #{ARGV[0]} present, Usage script <filename>"
end

$ ./script file
# The changes are written to the file with nothing printed to stdout
$ cat ./file
dimension=1920x1024:format=jpg
dimension=800x600:format=jpg

实际上问如何将序列\uXXXX转换成对应的Unicode码位。这与其他反斜杠转义或一般处理反斜杠有很大不同。 echo -exargs 都不是特别适合这个任务。

这是一种方法:

perl -CSD -pe 's/\u(\X{4})/chr(oct("0x"))/ge' <<<"string"

由于 "0x" 前缀,oct("0xff") 实际上执行了十六进制解码。

显然,如果您的输入是文件中的文本而不仅仅是 shell 中的字符串,只需将其作为参数传递给 Perl。

对于小文件:

Bash:

cat file | echo -e "$(cat -)"

Zsh:

cat file | { echo -e "$(cat -)"; }

对于 bash 和 zsh 中的大文件:

cat file | while read -r LINE; do echo -e "$LINE"; done

(在行首丢失空格)