Diviser une expression SQL longue au délimiteur
Le contexte
J'essaye d'importer un dump qui a quelques longues lignes (8k + caractère) avec SQL * Plus, donc je fais face à l'erreur SP2-0027: Input is too long (> 2499 characters). Il s'agit d'une limite codée en dur et ne peut être surmontée.
Solution attendue
Je voudrais diffuser mon entrée en bash et diviser les lignes plus longues que la largeur attendue sur le dernier caractère ,(virgule).
Alors je devrais avoir quelque chose comme
cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe
Détails
- Je sais que la version plus récente peut accepter des lignes jusqu'à 4999 caractères mais j'ai encore des lignes plus longues (
cat my_dump.sql | grep '.\{5000\}' | wc -l) - Il n'est pas vraiment possible de mettre à jour le dump à la main
- J'ai essayé d'utiliser
trmais cela a divisé chaque ligne dont je ne veux pas - J'ai essayé d'utiliser
fmtetfoldmais il ne semble pas possible d'utiliser un délimiteur personnalisé - Je recherche actuellement
sedmais je n'arrive pas à trouver une expression rationnelle qui "trouverait la dernière correspondance,dans les 2500 premiers caractères s'il y a plus de 2500 caractères"
Réponses
Essayez quelque chose comme:
sed -re '/.{2500}/ s/.{,2500},/&\n/g'
Explication:
/.{2500}/si la ligne contient 2500 caractères (ou plus) ...s/.{,2500},/&\n/gremplacez jusqu'à 2500 caractères suivi d'un,ajout d'une nouvelle ligne
Je ne serais pas surpris si cela remplace certains "," ...
J'imagine que quelque chose comme cette commande awk fonctionnerait:
awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'
Le regex autorise jusqu'à 2498 caractères avant une virgule (donc 2499 avec la virgule), et insère une nouvelle ligne après elle. (J'ai utilisé 2499 car les messages d'erreur mentionnent ce nombre.)