J'ai un énorme fichier SQL qui est exécuté sur le serveur. La décharge vient de ma machine et y a quelques paramètres relatifs à ma machine. Donc, fondamentalement, je veux chaque occurrence de Comment cela peut-il être fait à partir de la ligne de commande? p> "c: // temp" code> à remplacer par
"// home // certains // bla" code> p> p> p> p> P>
7 Réponses :
Sed est un bon choix pour les fichiers volumineux.
vinko@mithril:~$ sed -i.bak -e 's%C://temp%//home//some//blah%' a.txt vinko@mithril:~$ more a.txt //home//some//blah D://temp //home//some//blah D://temp vinko@mithril:~$ more a.txt.bak C://temp D://temp C://temp D://temp
Vous pouvez utiliser un personnage différent pour éviter de devoir citer les barres obliques, par exemple SED -E «S% C: // temp% / home // Certains // bla%». En outre, l'option -i vous permet de sauvegarder le fichier surplace, lorsque vous êtes sûr des options.
C'est la commande que je tape: sed -i.bak -e 'S% C: \\ temp \% / home / liveon / public_html / tmp' liveon.sql et c'est l'erreur que je reçois: sed: -E Expression n ° 1, Char 41: Commande de `s 'non atténuée Toute personne?
Aussi, RD, assurez-vous d'échapper correctement aux backslashes.
La commande sed code> peut faire cela.
Plutôt que d'échapper aux barres obliques, vous pouvez choisir un délimiteur différent (_ dans ce cas):
sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt
Vous avez manqué le dernier soulignement: "S_C: // TEMP / _ / home // Certains // blah_"
Essayez Sed ? Quelque chose comme: échapper à tous ces esclaves rend ce look horrible cependant, voici un exemple plus simple qui change foo to bar. P> sed 's|c://temp\\|home//some//blah|' mydump.sql > fixeddump.sql
Merci Paul! Intellij Idea devient folle et fais cela pour des dizaines de minutes alors que SED ne prend que 1 seconde pour remplacer les backslash avec Double Backslash dans mon fichier SQL.
juste pour la complétude. En place, remplacement en utilisant perl code>.
perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp
Veuillez noter que si vous utilisez le drapeau -i code> sans extension, vous obtenez pas de sauvegarde i>. Si vous voulez une sauvegarde, essayez
-i.bak code> qui fera l'édition in-place et i> vous permet de sauvegarder l'original comme
original.bak Code>, à peu près gratuitement.
Je laisse ma version de contrôle du système de contrôle de la fabrication des sauvegardes.
@Jrockway: C'est charmant pour vous, j'en suis sûr, mais cela suppose que les fichiers en question sont sous la version de la version et que vous savez ce qu'est -i.bak et avez choisi de ne pas l'utiliser. Je souhaite juste que les personnes qui recommandent le commutateur -I prendraient deux secondes pour expliquer la différence entre -i et -i.bak. Cela fera très mal si les fichiers que vous jouez ne sont pas sous la version de la version et vous créez un simple typo (E.g, oubliez le drapeau -p).
Il existe également un utilitaire UNIX non standard, RPL , qui fait exactement la même chose que le sed code> exemples font; Cependant, je ne sais pas si
rpl code> fonctionne streamwise, donc
sed code> peut être la meilleure option ici. P>
Heh, par hasard, êtes-vous un ami du développeur de RPL? :-)
Nope, jamais entendu parler du gars en dehors de l'util; Il est arrivé utile pour effectuer un travail de lot-remplacer sur quelques milliers de fichiers texte une fois et je l'ai gardé dans ma boîte à outils.
Cela vaudrait la peine de dire pourquoi i> vous le recommandez dans ce cas (ou pourquoi vous pourriez, puisque vous reprenez la recommandation). C'est plutôt que de vomir le nom d'un utilitaire, dites-nous ce que vous avez aimé à ce sujet, s'il vous plaît.
RPL est agréable pour des remplacements simples car il a une syntaxe beaucoup plus conviviale que la combinaison de SED et constate qu'elle remplace. Il dispose également d'une fonction de course sèche soignée où elle vous dira ce qu'elle remplacerait sans effectuer le remplacement. C'est la principale limitation, c'est que cela ne fait que des remplacements droits et aucune expression régulière.
@Telemachus - Tyler a cloué.
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename The -p will treat this script as a loop, it will read the specified file line by line running the regex search and replace.-i This flag should be used in conjunction with the -p flag. This commands Perl to edit the file in place.-e Just means execute this perl code.Good luck
GAWK
awk '{gsub("c://temp","//home//some//blah")}1' file
Vous manquez un% de train dans votre commande. C'est S% foo% bar% non S% foo% bar