Mais algumas escolhas. Salvei seu texto de exemplo em file para simplificar.
-
grepe PCREs:$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' file purple yes violet affirmativePara colocá-los na mesma linha, basta analisar. Por exemplo
$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' | paste -d" " - - – purple yes violet affirmative -
sed$ sed 's/.*GRAPE=\([^,]*\).*FRUIT=\([^,]*\).*/ /' file purple yes violet affirmativeOu com o GNU
sed$ sed -r 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/ /' file purple yes violet affirmative -
Perl
$ perl -pne 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/ /' file purple yesVocê pode notar que o acima é um pouco semelhante ao
sedone :). Alternativamente:$ perl -lne '@f=(/(?:(?<=GRAPE=)|(?<=FRUIT=))(.+?),/g); print "@f"' file purple yes violet affirmativeIsso usa
,como separador de campo e pesquisa todos os campos:$ perl -F, -lane '@r=grep(s/.+?=//, grep(/GRAPE|FRUIT/,@F)); print "@r"' file purple yes violet affirmativeEste é mais curto, mas adiciona um espaço inicial a cada linha:
$ perl -F, -lane 'print grep(s/.+?=/ /, grep(/GRAPE|FRUIT/,@F));' file purple yes violet affirmative