Outra maneira:
sed 's/,\([^,]*\),/,"",/' <infile >outfile
Isso não funcionará em nenhuma linha sem pelo menos duas vírgulas - portanto, ele ignorará completamente qualquer linha que não tenha pelo menos as duas. E sempre obterá apenas as duas primeiras vírgulas - porque os padrões básicos de regexp são aplicados com base na regra mais longa à esquerda - o que significa que uma correspondência é sempre feita como em breve quanto possível e por um tempo longo . Em outras palavras, a primeira vírgula encontrada em uma linha satisfará a primeira para a qual procuramos, e a próxima será sempre a que segue imediatamente a sequência mais longa de caracteres não-vírgula entre eles.
sed 's/,\([^,]*\),/,"",/
' <<\IN
4,2014-05-08 18:22:24,14718202,4,184
4,2014-05-09 22:07:11,1278184,4,221
3,2014-05-05 10:01:24,1238461,1,222
IN
Ele corresponde à primeira vírgula, seguido imediatamente por [^,]* zero-ou-mais * caracteres que são [^ não ,]* vírgulas, seguidos imediatamente por mais uma vírgula. \( groups \) corresponde a não-vírgula em uma subexpressão e faz referência a esse primeiro grupo de correspondência (e aqui apenas) no campo de substituição à direita da declaração s/// ubstitution. As vírgulas são substituídas por uma vírgula ," e uma cotação e uma cotação ", e uma vírgula, mas o grupo com referências anteriores se substitui. E então ...
OUTPUT
4,"2014-05-08 18:22:24",14718202,4,184
4,"2014-05-09 22:07:11",1278184,4,221
3,"2014-05-05 10:01:24",1238461,1,222
Ou você poderia fazer ...
sed '/,.*,/s/[^,]*/"&"/2' <infile >outfile
Isso torna o s/// ubstitution condicional - porque a substituição usada aqui poderia se aplicar a uma linha que corresponde apenas a uma vírgula - nesse caso, ele citaria tudo além dela. Para garantir que a substituição se aplique apenas a linhas que correspondam a pelo menos duas vírgulas, explicitamente /,.*,/ endereça somente linhas que correspondam a pelo menos uma vírgula seguida por zero ou mais * . caracteres de qualquer tipo e pelo menos mais uma vírgula, e somente nessas linhas s/// ubstitute a correspondência 2cd para [^,]* zero-or-more * não-vírgulas com & cercado por " de suas aspas.
Ele ainda teria o campo certo, mesmo se o primeiro caractere em uma linha fosse uma vírgula, como:
sed '/,.*,/s/[^,]*/"&"/2' <<\IN
,2014-05-05 10:01:24,1238461,1,222
IN
... que imprime ...
,"2014-05-05 10:01:24",1238461,1,222
... porque a primeira correspondência para zero ou mais caracteres não-vírgula é a cadeia de comprimento zero que ocorre antes da primeira vírgula.