【问题标题】:Perl script just deletes the contents of my filesPerl 脚本只是删除我的文件的内容
【发布时间】:2014-04-16 05:40:17
【问题描述】:

我是 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;
        }
    }

}, '.');

【问题讨论】:

  • 在测试代码之前,切勿使用裸-i 开关。
  • 您需要打印;在你的 while()
  • [23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz] 最好写成[2-9A-Za-z]

标签: regex perl


【解决方案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;
}

【讨论】:

  • 谢谢。我的脚本基于你前几天给我的脚本:stackoverflow.com/questions/22991103/…,但你的脚本不包含打印。这是你的错还是我不明白?
  • 字符类也包含缺失字符。我很容易复制和粘贴列表。
  • 是的,我忘了包括print。当你刚刚回复时,我实际上正在寻找那个帖子。已更正。
  • 是的,鉴于该范围内缺少字符,也许不理会它是要走的路。如果你想要它更短,这会起作用:[2-9A-HJ-NP-Za-km-z]{27,35}
  • 效果非常好。还有另外一件事,就是添加到替换中的换行符。也许我能想出办法……
猜你喜欢
  • 2013-04-09
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2018-05-17
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多