[英]How to cut the second column of a string in an array using Perl
我有下面的代碼片段來讀取命令輸出並將其輸入到一個數組(@ret)中。
my @ret = `$cmd`;
chomp @ret;
foreach my $line (@ret)
{
print $line;
}
這是 $CMD 輸出,同樣的內容寫入@ret 數組。
(154) "1.T" Oct 15, 2020 7:05 AM
(159) "1.S" Oct 14, 2020 7:03 AM
(161) "1.R" Oct 13, 2020 7:03 AM
(163) "1.Q" Oct 11, 2020 7:06 AM
(164) "1.P" Oct 10, 2020 7:06 AM
(166) "1.N" Oct 8, 2020 1:53 AM
(167) "1.K" Oct 5, 2020 7:06 AM
(168) "1.J" Oct 4, 2020 4:44 PM
(169) "1.I" Oct 3, 2020 3:54 PM
(170) "1.H" Oct 3, 2020 7:02 AM
不確定,如何從此輸出中提取用雙引號括起來的第二列。 有人可以提供幫助或提供一些意見。 謝謝。
您可以通過將正則表達式直接應用於數組來做到這一點:
my @ret = `$cmd`;
s/(^[^"]+")|("[^"]+)//g for @ret;
基本上,正則表達式會刪除第一個雙引號之前的所有內容(包括雙引號本身),以及最后一個雙引號(包括)之后的所有內容。
考慮以下演示:
my @ret = (
q/(154) "1.T" Oct 15, 2020 7:05 AM/,
q/(159) "1.S" Oct 14, 2020 7:03 AM/,
q/(161) "1.R" Oct 13, 2020 7:03 AM/,
q/(163) "1.Q" Oct 11, 2020 7:06 AM/,
q/(164) "1.P" Oct 10, 2020 7:06 AM/,
q/(166) "1.N" Oct 8, 2020 1:53 AM/,
q/(167) "1.K" Oct 5, 2020 7:06 AM/,
q/(168) "1.J" Oct 4, 2020 4:44 PM/,
q/(169) "1.I" Oct 3, 2020 3:54 PM/,
q/(170) "1.H" Oct 3, 2020 7:02 AM/,
);
s/(^[^"]+")|("[^"]+)//g for @ret;
print "$_\n" for @ret;
產量:
1.T
1.S
1.R
1.Q
1.P
1.N
1.K
1.J
1.I
1.H
嘗試這個:
$line =~ m/"([^"]+)"/;
$secondColumn = $1;
匹配兩個引號之間的非引號字符,並取第一個捕獲組:
#!/usr/bin/perl
my $str = '(164) "1.P" Oct 10, 2020 7:06 AM';
$str =~ m/"([^"]+)"/;
print $1;
演示: https : //www.ideone.com/HCBrG5
以下代碼片段將命令的輸出解析為哈希。 然后你就可以隨心所欲地操縱了。
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my $re = qr/\((\d+)\) "(.+?)" (.*)\z/;
my $data;
while( <DATA> ) {
chomp;
my($event,$id,$date) = $_ =~ /$re/;
$data->{$event} = { id => $id, date => $date };
}
say Dumper($data);
say $data->{$_}{id} for sort { $a <=> $b } keys %{$data};
__DATA__
(154) "1.T" Oct 15, 2020 7:05 AM
(159) "1.S" Oct 14, 2020 7:03 AM
(161) "1.R" Oct 13, 2020 7:03 AM
(163) "1.Q" Oct 11, 2020 7:06 AM
(164) "1.P" Oct 10, 2020 7:06 AM
(166) "1.N" Oct 8, 2020 1:53 AM
(167) "1.K" Oct 5, 2020 7:06 AM
(168) "1.J" Oct 4, 2020 4:44 PM
(169) "1.I" Oct 3, 2020 3:54 PM
(170) "1.H" Oct 3, 2020 7:02 AM
輸出
$VAR1 = {
'168' => {
'id' => '1.J',
'date' => 'Oct 4, 2020 4:44 PM'
},
'164' => {
'date' => 'Oct 10, 2020 7:06 AM',
'id' => '1.P'
},
'159' => {
'id' => '1.S',
'date' => 'Oct 14, 2020 7:03 AM'
},
'166' => {
'date' => 'Oct 8, 2020 1:53 AM',
'id' => '1.N'
},
'170' => {
'date' => 'Oct 3, 2020 7:02 AM',
'id' => '1.H'
},
'154' => {
'date' => 'Oct 15, 2020 7:05 AM',
'id' => '1.T'
},
'169' => {
'date' => 'Oct 3, 2020 3:54 PM',
'id' => '1.I'
},
'167' => {
'date' => 'Oct 5, 2020 7:06 AM',
'id' => '1.K'
},
'163' => {
'date' => 'Oct 11, 2020 7:06 AM',
'id' => '1.Q'
},
'161' => {
'date' => 'Oct 13, 2020 7:03 AM',
'id' => '1.R'
}
};
1.T
1.S
1.R
1.Q
1.P
1.N
1.K
1.J
1.I
1.H
只需抓住引號中的內容!
@ret = map { /"([^"]*)"/ } @ret;
print "$_\n" for @ret;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.