Divida a expressão SQL longa no delimitador
Contexto
Estou tentando importar um dump que tem algumas linhas longas (8k + caracteres) com SQL * Plus, então enfrento o erro SP2-0027: Input is too long (> 2499 characters). Este é um limite embutido em código e não pode ser superado.
Solução esperada
Eu gostaria de transmitir minha entrada em bash e dividir as linhas mais longas do que a largura esperada no último ,caractere (vírgula).
Então, eu deveria ter algo como
cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe
Detalhes
- Eu sei que a versão mais recente pode aceitar linhas de até 4999 caracteres, mas ainda tenho linhas mais longas (
cat my_dump.sql | grep '.\{5000\}' | wc -l) - Não é realmente viável atualizar o dump manualmente
- Eu tentei usar,
trmas isso divide todas as linhas que eu não quero - Eu tentei usar
fmte,foldmas não parece ser possível usar um delimitador personalizado - No momento, estou procurando,
sedmas não consigo descobrir uma regexp que "encontre a última correspondência entre,os primeiros 2.500 caracteres se houver mais de 2.500 caracteres"
Respostas
Experimente algo como:
sed -re '/.{2500}/ s/.{,2500},/&\n/g'
Explicação:
/.{2500}/se a linha contém 2500 caracteres (ou mais) ...s/.{,2500},/&\n/gsubstitua até 2500 char seguido pela,adição de uma nova linha
Eu não ficaria surpreso se isso substituísse algum "," ...
Imagino que algo como este comando awk funcione:
awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'
O regex permite até 2.498 caracteres antes da vírgula (portanto, 2.499 incluindo a vírgula) e insere uma nova linha depois dela. (Usei 2.499, pois as mensagens de erro mencionam esse número.)