1

我正在尝试使用正则表达式模式替换来用制表符替换 md5sum 输出中的所有空格,并翻转正常的 md5sum 输出(fingerprint<space>/path/to/file),使其首先打印 /path/to/file,然后在输出中打印 md5 指纹到 STDOUT。我让它工作得很好,但由于某种原因,并不是我所有的空格都转换为制表符,正如您在此示例输出中看到的那样(参见第 4 项的 ps 项):

/bin/pidof  7b6aa27625786df26cd2511a6ccb8ec6 

/bin/ping   120d994f6bd6e05e10c7aa4ffeb157b9 

/bin/ping6  6578368ea1a280524ad5c944e8de825f 

/bin/ps a68ff229e6c54ffa71d3de956395af5c 

/bin/pwd    a30c8ea470134ba60d9008ca5723c556 

/bin/rbash  83f4aacf3157bfab413d009f48980e61 

代码

#!/usr/bin/perl -w

foreach $arg (@ARGV) {
push (@md5, `md5sum $arg`);
}

foreach $entry (@md5) {
$entry =~ s/(^.*) +(.*$)/$2\t$1/;
print $entry . "\n";
}

我创建了一个包含 4 个名为 a、b、c 和 d 的空白文本文件的示例目录,并运行了我的 perl 脚本,它运行良好。是什么赋予了?

** 测试目录中的良好输出*

host{user}114: ls
a  b  c  d  mymd5.pl
host{user}115: ./mymd5.pl *
a   d41d8cd98f00b204e9800998ecf8427e 

b   d41d8cd98f00b204e9800998ecf8427e 

c   d41d8cd98f00b204e9800998ecf8427e 

d   d41d8cd98f00b204e9800998ecf8427e 

mymd5.pl    719e2f8f878077ae3ef037369eb38e48 

host{user}116: 
4

1 回答 1

1

那这个呢?它使用空格来获得固定长度的第一列,然后是 TAB。

#!/usr/bin/perl -w
use strict;
use warnings;

my @md5;
my $longest_filename = 0;
foreach my $arg (@ARGV) {
   push (@md5, `md5sum $arg`);
   $longest_filename = length($arg) if length($arg)>$longest_filename;
}
chomp(@md5);


$longest_filename++;
foreach my $entry (@md5) {
  my ($md5,$filename) = $entry =~ m/^(.+?)\s(.+?)$/gis;
  printf "%-".$longest_filename."s\t%-16s\n",$filename,$md5;  
}


 bd.pl                                  b367dcf675902583a113a13e3b345809
 p1.pl                                  f5a10f748917ac8cf90d2e223c5b1cbf
 lognlonglong_filename_tohave.txt       d41d8cd98f00b204e9800998ecf8427e
于 2013-10-21T09:18:59.527 回答