Я хотел извлечь (используя perl) xxx (строка после блока :) и prod (строка после Milestone :). Строка (после Block: и Milestone :) и количество пустых мест не стандартные. Я могу найти только всю строку, используя нижнюю команду:

use strict;
use warnings;

my $file = 'xxx.txt';
open my $fh, '<', $file or die "Could not open '$file' $!\n";
while (my $line = <$fh>){
    chomp $line;
#   my @stage_status = $line =~ /(\:.*)\s*$/;
my @stage_status = $line =~ /\b(Block)(\W+)(\w+)/;
    foreach my $stage_statuss (@stage_status){
        print "$stage_statuss\n";
    }
    }

Пример строки в файле:

| Block:                   | xxx | Milestone:           | prod        |
1
Blurman 1 Фев 2021 в 12:44

2 ответа

Лучший ответ

Используя gnu grep, вы можете:

grep -oP '\b(Block|Milestone)\W+\K\w+' file

xxx
prod

Подробная информация о RexEx:

  • \b; Граница слова
  • (Block|Milestone): совпадение Black или Milestone
  • \W+: соответствие 1+ несловесных символов.
  • \K: сбросить совпадающую информацию
  • \w+: соответствует 1+ словосочетанию

Обновление:

Предлагаемый код perl в соответствии с отредактированным вопросом OP:

use strict;
use warnings;

my $file = 'xxx.txt';
open my $fh, '<', $file or die "Could not open '$file' $!\n";

while (my $line = <$fh>){
    chomp $line;
    print "checking: $line\n";
    my @stage_status = $line =~ /\b(?:Block|Milestone)\W+(\w+)/g;
    
    foreach my $stage_statuss (@stage_status){
       print "$stage_statuss\n";
    }
}

Вывод:

checking: | Block:                   | xxx | Milestone:           | prod        |
xxx
prod
1
anubhava 2 Фев 2021 в 05:50

Вы можете сделать это с помощью простого awk. Установив соответствующие значения разделителя полей, мы можем получить необходимое значение. Просто установите разделитель полей в виде вертикальной черты, за которой следует пробел ИЛИ пробел, а затем в условии проверки основной программы, если 2-е поле является блоком: затем распечатайте 4-е поле.

awk -F'\\|[[:space:]]+|[[:space:]]+' '$2=="Block:"{print $4} $6=="Milestone:"{print $8}' Input_file


2-е решение: Практически такое же решение, как и мое 1-е решение выше, только здесь делается только 1 разделитель полей для awk.

awk -F'([[:space:]]+)?\\|([[:space:]]+|$)' '$2=="Block:"{print $3} $4=="Milestone:"{print $5}' Input_file
1
RavinderSingh13 1 Фев 2021 в 10:05
65990391