извлечение, начинающееся и заканчивающееся специальным символом

Для логического И, подобного этому, я обычно прибегаю кawk:

awk '/foo/ && /bar/ && /bah/ { print }' /path/to/file
1
09.07.2019, 16:23
2 ответа

Ваш подход терпит неудачу, потому что *означает "сопоставить максимально длинную строку". Это известно как «жадный» модификатор. Вы хотите «сопоставить кратчайшую возможную строку», не -жадный оператор. Итак, если ваш grepподдерживает это, используйте -P, чтобы включить расширенные регулярные выражения, и запустите:

$ grep -Po '/genomes.*?,' file 
/genomes/date/pa341,
/genomes/date/ha76870,
/genomes/date/btr256,

Однако лучшим подходом было бы сопоставить как можно больше символов, отличных от -,,:

$ grep -o '/genomes[^,]*' file 
/genomes/date/pa341
/genomes/date/ha76870
/genomes/date/btr256
4
27.01.2020, 23:17

Вот несколько способов получить информацию:

$ grep -oP '/genomes((?!,).)*'  myfile.txt

$ perl -F, -pale '
     shift @F until $F[0] =~ m{/genomes.*};
     $_ = $&;
'  myfile.txt

$ perl -lne '
     my $p1 = index $_, "/genomes";
     my $p2 = index $_, ",", $p1;
    print substr $_, $p1, $p2-$p1;
' myfile.txt

$ sed -ne '
     /\n/!s|/genomes|\n&|
    y/,/\n/
   /^\/genomes/!D;P
' myfile.txt

Результаты:

/genomes/date/pa341
/genomes/date/ha76870
/genomes/date/btr256
0
27.01.2020, 23:17

Теги

Похожие вопросы