Antes de mais nada, a sua ideia grep -Po '"\K[^"]*' file
falha porque grep
vê as duas "One"
e ". the second is here"
entre aspas. Pessoalmente, eu provavelmente apenas faria
$ grep -oP '"[^"]+"' file | tr -d '"'
One
Two
Three
Four
Mas isso são dois comandos. Para fazer isso com um único comando, você poderia usar um dos seguintes:
-
Perl
$ perl -lne '@F=/"\s*([^"]+)\s*"/g; print for @F' file One Two Three Four
Aqui, a matriz
@F
contém todas as correspondências da expressão regular (uma cotação, seguida por tantas não"
quanto possível até a próxima"
). Oprint for @F
significa apenas "imprimir cada elemento de@F
. -
Perl
$ perl -F'"' -lne 'for($i=1;$i<=$#F;$i+=2){print $F[$i]}' file One Two Three Four
Para remover espaços iniciais / finais de cada partida, use isto:
perl -F'"' -lne 'for($i=1;$i<=$#F;$i+=2){$F[$i]=~s/^\s*|\s$//; print $F[$i]}' file
Aqui, o Perl está se comportando como
awk
. A opção-a
faz com que ela divida automaticamente as linhas de entrada nos campos do caractere fornecido por-F
. Como eu dei"
, os campos são:$ perl -F'"' -lne 'for($i=0;$i<=$#F;$i++){print "Field $i: $F[$i]"}' file Field 0: first matched is Field 1: One Field 2: . the second is here Field 3: Two Field 0: and here are in second line Field 1: Three Field 2: Field 3: Four Field 4: .
Como estamos procurando texto entre dois separadores de campo consecutivos, sabemos que queremos cada segundo campo. Então,
for($i=1;$i<=$#F;$i+=2){print $F[$i]}
imprimirá os que nos interessam. -
A mesma ideia, mas em
awk
:$ awk -F'"' '{for(i=2;i<=NF;i+=2){print $(i)}}' file One Two Three Four