Nas expressões regulares, [...]
indica um intervalo de caracteres para correspondência e (nesse contexto) ^
indica negação. Portanto, [^\"]
significa qualquer caractere, exceto as aspas duplas literais. Portanto, "[^"]*"
significa uma aspa dupla, seguida de uma seqüência de zero ou mais caracteres, exceto as aspas duplas, seguidas das aspas duplas de fechamento.
Observe que as escapadas de contrabarra são necessárias apenas porque você usou aspas duplas em torno da expressão. Você pode simplificá-la para
grep -o 'temp="[^"]*"' ~/.cache/weather.xml
Se você deseja que ele gere apenas a leitura da temperatura numérica, você pode usar um RE compatível com Perl em vez
grep -Po 'temp="\K[^"]*'