Eu acho que a steeldriver está no caminho certo com seu último comentário. Eu sou um usuário freqüente do Cygwin e vi coisas estranhas acontecerem com o texto que eu, por engano, não tirei de retornos de carro.
Vamos tentar um experimento. Eu tenho uma destilação básica do seu script:
result="$(cat $1)"
result="{\"docs\":[$result]}"
echo $result
Minha entrada é
{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}
Correndo com finais de linha adequados:
{"docs":[{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}]}
É o que esperamos.
Agora eu adiciono um retorno de carro à linha de entrada (usando Ctrl-K + Ctrl-M no vim) e corro de novo:
{"docs":[{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeI]}:"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}
Opa. Veja onde o% final ]}
acabou (logo antes de "EVT_IS_CONTROL_CONSULTATION"). Eles não são compensados da mesma maneira que o seu, mas essa é uma semelhança suspeita.
Efeitos semelhantes podem ser causados por outros caracteres de controle. Uma maneira simples de verificar se tais caracteres existem é usar grep '[^[:print:]]'
, que procura por caracteres "não imprimíveis" (ou seja, itens invisíveis, como caracteres de controle). Se o grep retorna qualquer coisa que confirme em que ponto existem várias maneiras de localizar e corrigir o (s) caractere (s) ofensivo (s). Você pode usar o mesmo regex com sed por exemplo. Ou use um editor hexadecimal (ou mesmo vim / xxd). Se for um CR, o mesmo comando sed usado pelo OP deve ser: sed 's/\r//g'