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 FourAqui, a matriz
@Fconté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 @Fsignifica apenas "imprimir cada elemento de@F. -
Perl
$ perl -F'"' -lne 'for($i=1;$i<=$#F;$i+=2){print $F[$i]}' file One Two Three FourPara 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]}' fileAqui, o Perl está se comportando como
awk. A opção-afaz 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