Destaque: você faz precisa detalhar seu ambiente um pouco mais como os comentários apontam.
Aqui está uma tentativa no meu shell Unix com sed
Sim, eu sei que você não quer sed
, mas pode ajudar você a construir o regex em seu ambiente.
data.txt:
"john doe"<[email protected]>;male,"jane doe"<[email protected];female
john_doe"<[email protected]>;male,"jane doe"<[email protected];female
# sed -n 's|^\("[^"]\+"[^,]\+\).*|| p' data.txt
"john doe"<[email protected]>;male
A ideia de regex aqui é saltar sobre o primeiro par de aspas duplas e depois procurar a vírgula.
Ele falhará se não houver aspas duplas.
Pode ser dimensionado para usar aspas simples.
Atualizar :
Procure por @
seguido por ,
...
data.txt:
"john doe"<[email protected]>;male,"jane doe"<[email protected];female
john_doe"<[email protected]>;male,"jane doe"<[email protected];female
# sed -n 's|\([^@]\+[^,]\+\),.*|| p' data.txt
"john doe"<[email protected]>;male
john_doe<[email protected]>;male
Agora você obtém os dois casos e também aqueles sem o nome da string ou até <>
wrap.
Mas, o seu problema é a dependência do ,
- quebras para o registro2 e registro3 onde você tem um único e-mail e sem vírgula. Ainda funcionaria se você forçasse um ,
no final de cada registro.