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

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\

【讨论】:

以上是关于仅用打印的十六进制格式替换文本文件中的某些字符的主要内容,如果未能解决你的问题,请参考以下文章

在java中如何修改文本文件中的某一行的某些数据??

无法用java替换html字符串中的某些文本

Sed 实记 · laoless‘s Blog

Java:从文本文件字符串中替换“[”“]”

XSLT 替换属性值和文本节点中的文本

R语言 二进制文件