O .*
no padrão regex é ganancioso, ele corresponde a uma string o maior tempo possível, então as citações correspondentes serão as últimas.
Como o separador é apenas um caractere aqui, podemos usar um grupo de colchetes invertidos para corresponder a qualquer coisa, exceto uma citação, ou seja, [^"]
e, em seguida, repetições para corresponder a um número de caracteres que não sejam aspas. p>
$ echo '... "foo" ... "bar" ...' | sed 's/[^"]*"\([^"]*\)".*//'
foo
Outra forma seria apenas remover tudo até a primeira cotação e, em seguida, remover tudo a partir da (nova) primeira citação:
$ echo '... "foo" ... "bar" ...' | sed 's/^[^"]*"//; s/".*$//'
foo
Em regexes Perl, os especificadores *
e +
podem ser tornados não-ávidos ao anexar um ponto de interrogação, portanto .*?
seria qualquer coisa, mas o mínimo de caracteres / bytes possível.