Come sostituire una string di text in più file in Linux

Ci sono diversi modi per sostituire una string di text con un altro in molti file. Ecco alcuni modi:

usando sed e trovare:

sed 's/oldstring/newstring/' "$1" > "$1".new && find -iname "*.new" | sed 's/.new//' | sh 

usando grep e sed:

 grep -rl oldstring . | xargs sed -i -e 's/oldstring/newstring/' 

usando grep e perl:

 grep -rl oldstring . | xargs perl -pi~ -e 's/oldstring/newstring/' 

Vi preghiamo di offrire i tuoi suggerimenti.

  • Estrarre il nome del repository da url GitHub in bash
  • Sostituire una string in un XML con Powershell provoca MALFORMED XML
  • Come get linee che contengono string in un file?
  • Strip una singola row da molti file
  • Come resettare una connessione TCP immediatamente su entrambe le estremità in una certa condizione usando linux netfilter / iptables?
  • 6 Solutions collect form web for “Come sostituire una string di text in più file in Linux”

    Vorrei usare Python per questo. Metti tutto questo codice in un file chiamato mass_replace e " chmod +x mass_replace ":

     #!/usr/bin/python import os import re import sys def file_replace(fname, s_before, s_after): out_fname = fname + ".tmp" out = open(out_fname, "w") for line in open(fname): out.write(re.sub(s_before, s_after, line)) out.close() os.rename(out_fname, fname) def mass_replace(dir_name, s_before, s_after): for dirpath, dirnames, filenames in os.walk(dir_name): for fname in filenames: f = fname.lower() # example: limit replace to .txt, .c, and .h files if f.endswith(".txt") or f.endswith(".c") or f.endswith(".h"): f = os.path.join(dirpath, fname) file_replace(f, s_before, s_after) if len(sys.argv) != 4: u = "Usage: mass_replace <dir_name> <string_before> <string_after>\n" sys.stderr.write(u) sys.exit(1) mass_replace(sys.argv[1], sys.argv[2], sys.argv[3]) 

    Per una singola ricerca e sostituzione di una string in un tipo di file, la soluzione con Find e Sed non è male. Ma se volete fare un sacco di elaborazioni in un solo passaggio, puoi modificare questo programma per estenderlo e sarà facile (e probabilmente sarà la prima volta corretta).

    Usando GNU find, xargs e sed come questo:

      find -name '*.txt' -o -name '*.html' -print0 | xargs -0 -P 1 -n 10 sed --in-place 's/oldstring/newstring/g' 

    Regolare i parametri -P e -n come volete. Il /g è necessario in modo che each occorrenza in una linea venga sostituita, non solo la prima ( g è globale se ricordo bene). È inoltre ansible passare un valore in --in-place per eseguire un backup.

    Mi piace la ricetta del filter nel perl.

      perl -pi.bak -e '/ da / a /' file1 file2 ... 

    Nel context…

     % echo -e 'foo\ngoo\nboo' >test % perl -pi.bak -e 's/goo/ber/' test % diff -u test.bak test --- test.bak 2010-01-06 05:43:53.072335686 -0800 +++ test 2010-01-06 05:44:03.751585440 -0800 @@ -1,3 +1,3 @@ foo -goo +ber boo 

    ecco il taglio rapido tagliato sull'incantation perl utilizzato …

     % perl --help Usage: perl [switches] [--] [programfile] [arguments] -e program one line of program (several -e's allowed, omit programfile) -i[extension] edit <> files in place (makes backup if extension supplied) -n assume "while (<>) { ... }" loop around program -p assume loop like -n but print line also, like sed 

    Supponendo che l'elenco di file non sia lungo un miglio, non è necessario utilizzare xargs, poiché sed può gestire più file nella row di command:

     sed -i -e 's/oldstring/newstring/' `grep -rl oldstring .` 

    Fare attenzione se sostituisci gli URL con il carattere "/".

    Un esempio di come farlo:

     sed -i "s%http://domain.com%http://www.domain.com/folder/%g" "test.txt" 

    Estratto da: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    Grazie per alcune grandi risposte a tutti! Questo è stato super-utile.

    Dal momento che non avevo centinaia di file per sostituire le righe, ho usato un loop, come questo:

      for R in 1 2 3 4 5; do sed -i -e 's/oldstring/newstring/' file$R; done 

    Spero possa aiutare!

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.