如何解码 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 -e
和 xargs
都不是特别适合这个任务。
这是一种方法:
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
(在行首丢失空格)
我有一些字符串,例如:
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 -e
和 xargs
都不是特别适合这个任务。
这是一种方法:
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
(在行首丢失空格)