【问题标题】:How to cut the second column of a string in an array using Perl如何使用 Perl 剪切数组中字符串的第二列
【发布时间】:2021-02-01 16:19:57
【问题描述】:

我有下面的 sn-p 来读取命令输出并将其输入数组(@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

不确定如何从此输出中提取用双引号括起来的第二列。有人可以帮助或提供一些意见。 谢谢。

【问题讨论】:

  • 你的$cmd 是什么?也许有一种更简单的方法可以得到你想要的。

标签: arrays regex string perl


【解决方案1】:

您可以通过将正则表达式直接应用于数组来做到这一点:

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

【讨论】:

    【解决方案2】:

    试试这个:

    $line =~ m/"([^"]+)"/;
    $secondColumn = $1;
    

    【讨论】:

      【解决方案3】:

      匹配两个引号之间的非引号字符,并取第一个捕获组:

      #!/usr/bin/perl
      
      my $str = '(164) "1.P" Oct 10, 2020 7:06 AM';
      
      $str =~ m/"([^"]+)"/;
      print $1;
      

      演示:https://www.ideone.com/HCBrG5

      【讨论】:

      • 感谢大家的及时回复。
      【解决方案4】:

      以下代码片段将命令的输出解析为哈希。然后,您可以随心所欲地进行操作。

      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
      

      【讨论】:

        【解决方案5】:

        只需抓住引号中的内容!

        @ret = map { /"([^"]*)"/ } @ret;
        print "$_\n" for @ret;
        

        【讨论】:

        • 比目前接受的解决方案简单得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 2021-09-11
        相关资源
        最近更新 更多