仅用打印的十六进制格式替换文本文件中的某些字符
Posted
技术标签:
【中文标题】仅用打印的十六进制格式替换文本文件中的某些字符【英文标题】:Replace only certain characters in text files with printed hex format 【发布时间】:2018-10-29 04:00:30 【问题描述】:我正在尝试将旧的 PortaPuTTY 配置文件转换为 KiTTY 的配置文件格式。
PortaPutty 使用 'Field=Value' 格式,而 KiTTY 使用 'Field\Value\' 格式。
我可以通过以下方式将 PortaPuTTY 转换为 KiTTY 格式:
sed -i -e 's/=/\/g' -e 's/.$/\/'
所以
LogFileName=putty.log
LogType=0
...
被翻译成:
LogFileName\putty.log\
LogType\0\
...
等等
但是,在 KiTTY 格式中,特殊字符会转换为打印的十六进制格式。例如:
PublicKeyFile=C:\Users\user.name\mykey.ppk
需要翻译成:
PublicKeyFile\C%3A%5CUsers%5Cuser.name%5Cmykey.ppk\
看起来以打印的十六进制而不是常规的 ascii 表示的值范围是 0x20-0x2F、0x3A-0x3F 或 0x7B-0x7F。
有没有用 sed、awk、python 等翻译的好方法?
【问题讨论】:
这看起来像是一个有效的方法:superuser.com/questions/410398/… 【参考方案1】:据我所知,没有将特殊字符转换为十六进制代码。文件名和路径只是 URL 编码的。
我创建了一个 Perl 脚本来处理它:
#!/usr/bin/env perl
use strict;
use warnings;
use URI::Escape;
my $regex = qr/(.*?)%3D(.*)$/p;
my $file = "/some/where/conf.file";
open my $input, '<', $file or die "can't open $file: $!";
while (<$input>)
chomp;
my $result = uri_escape( $_ ) =~ s/$regex/$1\\$2\\/rg;
print $result . "\n";
close $input or die "can't close $file: $!";
输入:
PublicKeyFile=C:\Users\user.name\mykey.ppk
LogFileName=putty.log
LogType=0
输出:
PublicKeyFile\C%3A%5CUsers%5Cuser.name%5Cmykey.ppk\
LogFileName\putty.log\
LogType\0\
【讨论】:
以上是关于仅用打印的十六进制格式替换文本文件中的某些字符的主要内容,如果未能解决你的问题,请参考以下文章