如何在bash中解码\ u003d?

时间:2018-01-30 06:38:21

标签: bash unicode echo xargs

我有一些字符串:

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,就好像它们被引用一样?

3 个答案:

答案 0 :(得分:3)

实际询问如何将序列\uXXXX转换为相应的Unicode代码点。这与其他反斜杠转义完全不同,或者通常处理反斜杠。 echo -exargs都不适合这项任务。

这是一种方式:

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

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

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

答案 1 :(得分:1)

对于小文件:

重击:

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

Zsh:

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

对于bash和zsh中的大文件:

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

(在行首丢失空格)

答案 2 :(得分:0)

这是尝试使用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) { $1.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