8
votes

Commande Linux à remplacer la chaîne dans un fichier grand avec une autre chaîne

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 "c: // temp" à remplacer par "// home // certains // bla"

Comment cela peut-il être fait à partir de la ligne de commande?


1 commentaires

Vous manquez un% de train dans votre commande. C'est S% foo% bar% non S% foo% bar


7 Réponses :


29
votes

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


3 commentaires

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.



1
votes

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


1 commentaires

Vous avez manqué le dernier soulignement: "S_C: // TEMP / _ / home // Certains // blah_"



4
votes

Essayez Sed ? Quelque chose comme: xxx pré>

é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


1 commentaires

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.



12
votes

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


3 commentaires

Veuillez noter que si vous utilisez le drapeau -i sans extension, vous obtenez pas de sauvegarde . Si vous voulez une sauvegarde, essayez -i.bak qui fera l'édition in-place et vous permet de sauvegarder l'original comme original.bak , à 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).



3
votes

Il existe également un utilitaire UNIX non standard, RPL , qui fait exactement la même chose que le sed exemples font; Cependant, je ne sais pas si rpl fonctionne streamwise, donc sed peut être la meilleure option ici.


5 commentaires

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 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é.



1
votes
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

0 commentaires

1
votes

GAWK

awk '{gsub("c://temp","//home//some//blah")}1' file


0 commentaires