仅替换打印的十六进制格式的文本文件中的某些字符

时间:2018-05-18 16:46:26

标签: regex string search replace translation

我试图将旧的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等来翻译它?

1 个答案:

答案 0 :(得分:0)

从我所看到的,没有特殊字符到十六进制代码的转换。文件名和路径只是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\