Unix Shell Boucle dans les fichiers et remplace les textes

Je suis assez nouveau à ce sujet, et j’ai besoin d’un fichier shell pour parcourir tous les fichiers “.xml” dans un dossier, et faire des remplacements de texte. Jusqu’à présent, j’ai trouvé ceci:

sed "s/old_text/new_text/g" testfile.xml -i 

Cependant, je veux que cela s’exécute sur tous les fichiers XML du dossier actuel, pas seulement sur “testfile.xml”. En outre, comment puis-je effectuer une sauvegarde du fichier d’origine?

Toute consortingbution est plus que bienvenue! Merci beaucoup!

Pour exécuter sed sur tous les fichiers XML, spécifiez simplement le caractère générique

 sed "s/old_text/new_text/g" *.xml -i 

Pour créer une sauvegarde, spécifiez simplement l’extension après -i :

 sed "s/old_text/new_text/g" *.xml -i~ 

Notez qu’il est généralement préférable d’utiliser des outils compatibles XML pour gérer le XML.

Pour tous .xml fichiers .xml situés dans le répertoire en cours:

 sed -i.bak 's/old_text/new_text/g' *.xml 

Pour rentrer dans les sous-répertoires, combiner avec find :

 find . -name '*.xml' -exec sed -i.bak 's/old_text/new_text/g' '{}' \; 

Les fichiers de sauvegarde se termineront par .xml.bak (le paramètre à -i est ajouté au nom de fichier d’origine).

Des mains un peu plus approfondies sur les exemples, couvrant l’avertissement. Avec un grand pouvoir vient une grande responsabilité, et le remplacement de masse signifie un grand pouvoir 😉

 # only take files form certain subfolders and certain extensions # be careful to not tamper with .git or .svn folders # - thus excluding all hidden folders as an extra precaution # - also tampering with node_modules is a bad idea FILES=$(find . -type f -regextype posix-extended \ -regex "^\./(public|source)/.*\.(scss|js)$" \ -not -regex ".*\/(\.|node_modules).*") for f in $FILES do echo "Processing $f file..." # all files: prune trailing whitespace on each file. sed -i 's/ *$//' $f if [[ $f =~ \.js$ ]]; then echo "javascript file!" # DO stuff fi if [[ $f =~ \.scss$ ]]; then echo "scss file!" # \b whole word matching – stackoverflow.com/a/1032039/444255 sed -i 's/\#000\b/black/g' $f sed -i 's/\#000000\b/black/g' $f sed -i 's/\#fff\b/white/g' $f sed -i 's/\#ffffff\b/white/g' $f fi done