brew install gnu-sed
PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
feel better
Use
sed '/#start/,/#end/replace_command'
For example, if the file is called myconfig, and you want to replace "allow" with "deny" in that section, you could say
sed '/#start/,/#end/s/allow/deny/' myconfig
example
sed -i -r "/<elasticConfig>/,/<\/elasticConfig>/s,<enabled>.+</enabled>,<enabled>false</enabled>," file.xml
for root, dirs, files in os.walk("folder"):
for file in files:
if file.endswith(".yml"):
print(os.path.join(root, file))
with open(os.path.join(root, file), "r") as sources:
lines = sources.readlines()
with open(os.path.join(root, file), "w") as sources:
for line in lines:
sources.write(re.sub(r'pattern', 'foo', line))
DELIM=$(echo -en "\001");
sed -i "s${DELIM}SEARCH${DELIM}${VAR}${DELIM}" $config
ce qui est catch avec sed peut être utilisé dans le pattern de remplacement : &
je sais pas pourquoi j'arrive jamais à m'en souvenir :
sed -i 8d file
Un petit truc pas mal pour sed sans risque, d'habitude je fais :
sed -i 's/hello/toto/' file.txt
Mais si le résultat ne me plait pas, trop tard le fichier est édité. On peut faire un backup en rajoutant un suffix à l'argument "-i" :
sed -i.backup 's/hello/toto/' file.txt
(oui oui tout attaché) Du coup je me retrouve avec deux fichiers : l'orgininal (file.txt.backup) et le modifié file.txt
PS : on peut aussi faire autrement sans utiliser le -i et en redirigeant le résultat vers un nouveau fichier mais l'approche est différente
grep -rl mot1 *.php | xargs sed -i 's/mot1/mot2/g'
bash# sed -i ’s/[texte_recherché]/[texte_de_remplacement]/’ monfichier.txt
Pour l’exercice nous allons dire que monfichier.txt comporte une liste d’anciennes adresses email @wanadoo.fr et que nous désirons les mettre à jour en @orange.fr .
bash# cat monfichier.txt
toto@wanadoo.fr
toto@wanadoo.fr
toto@wanadoo.fr
etc.
Donc dans ce cas, cela nous donnera :
bash# sed -i ’s/wanadoo/orange/g’ monfichier.txt
Voilà en détail l’explication :
On passe à la commande sed le paramètre “-i” pour l’édition du fichier monfichier.txt
Le paramètre “-s” (substituer) qui définit l’action de rechercher / remplacer,
l’expression régulière (REGEX),
puis le ‘g’ (action global) à la suite pour la modification de toutes les instances de la chaîne de caractères remplacer dans le fichier.
Dans le cas où on voudrait ne remplacer que la première qui aurait été trouvée, il faudra modifier comme suit : ‘s/texte1/texte2/’
Bon, cela fonctionne sur un fichier, maintenant dans le cas de plusieurs fichiers, voici la commande ‘find’ qui va compléter l’astuce.
bash# find . -maxdepth 1 -name “*.txt” -type f -exec sed -i ’s/wanadoo/orange/g’ {} \
En détail cela nous donne:
Nous utilisons la commande ‘find’ pour récupérer la liste des fichiers ‘.txt’ à traiter,
dans le dossier courant ‘.’ et de ne pas aller plus bas ‘-maxdepth 1′,
puis donc de lister les fichiers dont le nom finit par “*.txt” : ‘-name “*.txt” -type f’.
on utilise alors l’option ‘-exec’ pour dire à ‘find’ d’utiliser la commande qui suit sur les fichiers trouvés.
Et voilà, simple non ?