Для логического И, подобного этому, я обычно прибегаю кawk
:
awk '/foo/ && /bar/ && /bah/ { print }' /path/to/file
Ваш подход терпит неудачу, потому что *
означает "сопоставить максимально длинную строку". Это известно как «жадный» модификатор. Вы хотите «сопоставить кратчайшую возможную строку», не -жадный оператор. Итак, если ваш 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
Вот несколько способов получить информацию:
$ 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