首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在shell中解码URL编码的字符串?

如何在shell中解码URL编码的字符串?
EN

Stack Overflow用户
提问于 2018-04-18 23:43:08
回答 2查看 0关注 0票数 0

我有一个包含编码的用户代理列表的文件。例如:

代码语言:javascript
复制
Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en

我想要一个shell脚本,它可以读取这个文件,并用解码的字符串写入一个新的文件。

代码语言:javascript
复制
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en

我一直在试图用这个例子来实现它,但目前为止还没有成功。

代码语言:javascript
复制
$ echo -e "$(echo "%31+%32%0A%33+%34" | sed 'y/+/ /; s/%/\\x/g')"

我的脚本看起来像:

代码语言:javascript
复制
#!/bin/bash
for f in *.log; do
  echo -e "$(cat $f | sed 'y/+/ /; s/%/\x/g')" > y.log
done
EN

回答 2

Stack Overflow用户

发布于 2018-04-19 07:59:22

GNU awk

代码语言:txt
复制
#!/usr/bin/awk -fn
@include "ord"
BEGIN {
  RS = "%.."
}
{
  printf RT ? $0 chr("0x" substr(RT, 2)) : $0
}

代码语言:txt
复制
#!/bin/sh
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
票数 0
EN

Stack Overflow用户

发布于 2018-04-19 08:48:13

代码语言:javascript
复制
perl -pi.back -e 'y/+/ /;s/%([\da-f]{2})/pack H2,$1/gie' ./*.log

随着-i更新文件就地(一些sed实施已经借用perl.back作为备份扩展。

s/x/y/ex用perl代码的e评估代替y

这种情况下的perl代码用于pack将在$1(正则表达式中的第一个圆括号对)中捕获的十六进制数字打包为相应的字符。

另一种方法pack是使用chr(hex($1))

代码语言:javascript
复制
perl -pi.back -e 'y/+/ /;s/%([\da-f]{2})/chr hex $1/gie' ./*.log

如果可用,还可以使用uri_unescape()来自URI::Escape

代码语言:javascript
复制
perl -pi.back -MURI::Escape -e 'y/+/ /;$_=uri_unescape$_' ./*.log
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档