Я хотел извлечь (используя 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 |
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
Вы можете сделать это с помощью простого 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
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки, синтаксического анализа и преобразования строк. Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, определяющий применимый язык программирования или инструмент.