我是Perl的新手所以请原谅我。我尝试做的是使用一些外部程序的执行将匹配的字符串转换为替换字符串。我尝试使用它并且它可以工作,除了替换字符串包含一个我不想要的换行符:
perl -i'' -e '$from = "C"; $to = "00"; $match = "(" . $from . "[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27,35})";' -pe 's/$match/`base58ChecksumEncode "$to\$(base58Converter -d $1 | cut -c 3- | rev | cut -c 9- | rev | cut -c 3-)"`/eg;' file1.txt
但是当我尝试将其转换为从pwd递归地处理所有文件的脚本时,将删除所有文件内容。我无法弄清楚为什么。这是我放在一起的脚本的内容。
#!/usr/local/bin/perl
use strict;
use warnings;
use autodie;
use File::Find;
die "Usage: $0 From_Character_Prefix To_Hex_Prefix\n" if @ARGV != 2;
my ($from, $to) = @ARGV;
$ENV{LD_LIBRARY_PATH}='/usr/local/lib';
finddepth(sub {
return if $File::Find::dir =~ /.git\b/;
if (-f) {
local @ARGV = $_;
local $^I = '.bak';
while (<>) {
my $match = "(" . $from . "[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27,35})";
s/$match/`base58ChecksumEncode "$to\$(base58Converter -d $1 | cut -c 3- | rev | cut -c 9- | rev | cut -c 3-)"`/eg;
}
}
}, '.');
答案 0 :(得分:1)
每当使用perl的就地替换$^I
时,请不要忘记实际print
该行:
local @ARGV = $_;
local $^I = '.bak';
while (<>) {
my $match = "(" . $from . "[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27,35})";
s/$match/`base58ChecksumEncode "$to\$(base58Converter -d $1 | cut -c 3- | rev | cut -c 9- | rev | cut -c 3-)"`/eg;
print; # <--- Need this
}
此外,使用字符类中的范围可以大大简化您的正则表达式:[2-9A-Za-z]{27,35}
更新以从“返回值
中删除换行符while (<>) {
my $match = "(" . $from . "[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27,35})";
s{$match}{
my $command = `base58ChecksumEncode "$to\$(base58Converter -d $1 | cut -c 3- | rev | cut -c 9- | rev | cut -c 3-)"`;
chomp $command;
$command;
}eg;
print;
}