Isso é um pouco complicado apenas com expressões regulares, mas isso pode ser feito em várias etapas. Aqui está o script perl que eu usei para isso (sed não pode ser usado porque eu usei lookaheads):
perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;s/"/""/g;s/~~(.*?)~~/~~""~~/g;s/~~~~/|/g;s/~~//g' inputfile.txt
(use perl -pi -e
se você quiser editar o arquivo de entrada)
O script executa as seguintes etapas:
- Procure por tudo o que estiver dentro de | "{...}" |, (início da linha) "{...}" | ou | "{...}" (fim da linha), ignorando espaços fora do texto. Substitua os bits externos por
~~
(usei algo que não é conhecido dentro do texto) - Substitua todas as aspas restantes por outras duplicadas
- Substitua todas as seqüências
~~{...}~~
internas por~~"{...}"~~
- Substitua todas as seqüências de
~~~~
(que serão todas internas) para|
- Remove todas as sequências
~~
restantes (que estarão no início e no final das linhas)
Execução de cada etapa, de acordo com o seguinte texto de teste:
"164829" | "collection 1" | "wood plank 2" x 4" long" | "23.5"
"939485"|"collect "name""|"more items with | " and ""|"294.5""
Recebemos a seguinte saída após cada etapa:
$ perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;' testinput.txt
~~164829~~~~collection 1~~~~wood plank 2" x 4" long~~~~23.5~~
~~939485~~~~collect "name"~~~~more items with | " and "~~~~294.5"~~
$ perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;s/"/""/g;' testinput.txt
~~164829~~~~collection 1~~~~wood plank 2"" x 4"" long~~~~23.5~~
~~939485~~~~collect ""name""~~~~more items with | "" and ""~~~~294.5""~~
$ perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;s/"/""/g;s/~~(.*?)~~/~~""~~/g;' testinput.txt
~~"164829"~~~~"collection 1"~~~~"wood plank 2"" x 4"" long"~~~~"23.5"~~
~~"939485"~~~~"collect ""name"""~~~~"more items with | "" and """~~~~"294.5"""~~
$ perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;s/"/""/g;s/~~(.*?)~~/~~""~~/g;s/~~~~/|/g;' testinput.txt
~~"164829"|"collection 1"|"wood plank 2"" x 4"" long"|"23.5"~~
~~"939485"|"collect ""name"""|"more items with | "" and """|"294.5"""~~
$ perl -pe 's/(?:(?:\||^)[ ]*"(.*?)\"[ ]*(?=\||$))/~~~~/gm;s/"/""/g;s/~~(.*?)~~/~~""~~/g;s/~~~~/|/g;s/~~//g' testpipe.txt
"164829"|"collection 1"|"wood plank 2"" x 4"" long"|"23.5"
"939485"|"collect ""name"""|"more items with | "" and """|"294.5"""