我正在尝试将以下日志转换为纯文本之后的一些帮助。
这是一个网址,因此可能有%20 ='空格'和其他但我正在尝试转换的主要部分是char(1,2,3,4,5,6)
到文本。
以下是我要转换的示例。
选择%20char(45,120,49,45,81,45),炭(45,120,50,45,81,45),炭(45,120,51,45,81,45)
到目前为止,我尝试添加到char(in here)
并使用chr($2)
perl -pe "s/(char())/chr($2)/ge"
所有这一切设法都是删除char但现在我正在尝试将数字转换为文本并删除逗号和括号。
我可能会因为我对perl相当陌生而离开。
perl -pe" s / 删除 / 字以将其更改为 / ge"
" s /(char(这里的内容))/ chr($ 2)/ ge"
输出尝试实现
选择-x1-Q - , - x2-Q - , - x3-Q-
或者
选择%20-X1-Q - , - X2-Q - , - X 3-Q -
感谢您的帮助
答案 0 :(得分:4)
在这里做一个合理的单线太多了。此外,稍后将更容易调整脚本
use warnings;
use strict;
use feature 'say';
use URI::Escape 'uri_unescape';
my $string = q{select%20}
. q{char(45,120,49,45,81,45),char(45,120,50,45,81,45),}
. q{char(45,120,51,45,81,45)};
my $new_string = uri_unescape($string); # convert %20 and such
my @parts = $new_string =~ /(.*?)(char.*)/;
$parts[1] = join ',', map { chr( (/([0-9]+)/)[0] ) } split /,/, $parts[1];
$new_string = join '', @parts;
say $new_string;
打印
select -x1-Q-,-x2-Q-,-x3-Q-
评论
模块URI::Escape用于转换百分比编码字符,符合RFC 3986
未指明是否有任何内容可以跟随char(...)
s的部分,以及可能是什么。如果在最后char(...)
之后可以有更多内容将分拆调整为@parts
,或澄清
在char(...)
s的部分中,只需要数字,map中的正则表达式使用
如果你打算使用正则表达式,你应该阅读它。见
perlretut,教程
perlrequick,快速入门
perlre,完整的语法
答案 1 :(得分:0)
好吧,这将是一个混乱的"单线"。假设您的文本位于名为$text
的变量中。
$text =~ s{char\( ( (?: (?:\d+,)* \d+ )? ) \)}{
my @arr = split /,/, $1;
my $temp = join('', map { chr($_) } @arr);
$temp =~ s/^|$/"/g;
$temp
}xeg;
正则表达式匹配char(
,后跟逗号分隔的数字序列列表,后跟)
。我们捕获捕获组$1
中的数字。在替换中,我们在逗号上分割$1
(因为chr
仅适用于一个字符,而不是它们的整个列表)。然后我们在每个数字上映射chr
并将结果连接成一个字符串。下一行只是在字符串的开头和结尾加上引号(可能是你想要引用的输出),然后返回新的字符串。
输入:
select%20char(45,120,49,45,81,45),char(45,120,50,45,81,45),char(45,120,51,45,81,45)
输出:
select%20"-x1-Q-","-x2-Q-","-x3-Q-"
如果您想要替换%
转义序列,我建议您单独执行此操作。试图将两个替换整合到一个语句中会变得非常毛茸茸。
答案 2 :(得分:-1)
这会按照你的要求行事。它分两个阶段执行解码:首先使用chr hex $1
解码URI编码,然后将每个char()
函数转换为与其十进制参数的字符等价物相对应的字符串
use strict;
use warnings 'all';
use feature 'say';
my $s = 'select%20char(45,120,49,45,81,45),char(45,120,50,45,81,45),char(45,120,51,45,81,45)';
$s =~ s/%(\d+)/ chr hex $1 /eg;
$s =~ s{ char \s* \( ( [^()]+ ) \) }{ join '', map chr, $1 =~ /\d+/g }xge;
say $s;
select -x1-Q-,-x2-Q-,-x3-Q-