我有一些字符串:
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,就好像它们被引用一样?
答案 0 :(得分:3)
您实际询问如何将序列\uXXXX
转换为相应的Unicode代码点。这与其他反斜杠转义完全不同,或者通常处理反斜杠。 echo -e
和xargs
都不适合这项任务。
这是一种方式:
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