我有一个包含编码的用户代理列表的文件。例如:
Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
我想要一个shell脚本,它可以读取这个文件,并用解码的字符串写入一个新的文件。
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en
我一直在试图用这个例子来实现它,但目前为止还没有成功。
$ echo -e "$(echo "%31+%32%0A%33+%34" | sed 'y/+/ /; s/%/\\x/g')"
我的脚本看起来像:
#!/bin/bash
for f in *.log; do
echo -e "$(cat $f | sed 'y/+/ /; s/%/\x/g')" > y.log
done
发布于 2018-04-19 07:59:22
GNU awk
#!/usr/bin/awk -fn
@include "ord"
BEGIN {
RS = "%.."
}
{
printf RT ? $0 chr("0x" substr(RT, 2)) : $0
}
或
#!/bin/sh
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
发布于 2018-04-19 08:48:13
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))
:
perl -pi.back -e 'y/+/ /;s/%([\da-f]{2})/chr hex $1/gie' ./*.log
如果可用,还可以使用uri_unescape()
来自URI::Escape
:
perl -pi.back -MURI::Escape -e 'y/+/ /;$_=uri_unescape$_' ./*.log
https://stackoverflow.com/questions/-100003929
复制相似问题