Als je veel bestanden hebt met verouderde informatie, is het handmatig bijwerken ervan tijdrovend.
Of het nu gaat om het corrigeren van verouderde bestandspaden, het hernoemen van variabelen of het wijzigen van configuratiewaarden, Bash biedt krachtige hulpmiddelen zoals grep, sed en find om deze taak te automatiseren.
Het automatiseren van tekstvervanging is handig voor bijvoorbeeld:
In plaats van elk bestand handmatig te bewerken, kan een Bash-script dit in enkele seconden doen.
Stel je voor dat je meerdere bestanden hebt die verwijzen naar oude logbestandslocaties:
In plaats van elke instantie handmatig te zoeken en te vervangen, kunnen we dit automatiseren.
Eerst maken we een testomgeving voordat we echte bestanden wijzigen.
We maken daarvoor een testmap aan in de Home-map:
dany@pindabook:~$ mkdir -p ~/vervang_test && cd ~/vervang_test
De tweede opdracht (na &&) opent de pas aangemaakte map.
Daarna maken we voorbeeldbestanden aan met het oude pad:
dany@pindabook:~/vervang_test$ echo 'Log file: ~/data/logs/app.log' > script1.sh
dany@pindabook:~/vervang_test$ echo 'ERROR_LOG="~/data/logs/app.log"' > config.env
dany@pindabook:~/vervang_test$ echo 'echo "Processing ~/data/logs/app.log"' > process.sh
En controleren we het voorkomen van het oude pad:
dany@pindabook:~/vervang_test$ grep "~/data/logs/app.log" *
config.env:ERROR_LOG="~/data/logs/app.log"
process.sh:echo "Processing ~/data/logs/app.log"
script1.sh:Log file: ~/data/logs/app.log
Nu kunnen we met de teksteditor nano een script genaamd replace_text.sh aanmaken:
dany@pindabook:~/vervang_test$ nano replace_text.sh
Voer het volgende script in:
#!/usr/bin/env bash
if [[ $# -ne 3 ]]; then
echo "Gebruik: $0 <zoek_naar> <vervang_door> <werkmap>"
exit 1
fi
ZOEK_NAAR=$(printf '%s\n' "$1" | sed 's/[\/&]/\\&/g')
VERVANG_DOOR=$(printf '%s\n' "$2" | sed 's/[\/&]/\\&/g')
WERKMAP=$3
echo "Vervang in $WERKMAP $1 door $2."
# Zoek en vervang de tekst op een veilige manier
find "$WERKMAP" -type f -exec sed -i "s/$ZOEK_NAAR/$VERVANG_DOOR/g" {} +
echo "Vervanging voltooid."
De find opdracht zoekt daarbij naar alle bestanden en geeft de gevonden bestanden door aan de sed opdracht die zorgt voor het vervangen.
Dankzij de optie {} + verloopt dit zeer efficiënt.

Sla het script op en sluit nano met de sneltoets Ctrl+x. Antwoordt met j op de vraag om het script op te slaan en bevestig met Return.
Maak het script uitvoerbaar:
dany@pindabook:~/vervang_test$ chmod +x replace_text.sh
Voer het script uit om alle instanties van ~/data/logs/app.log te vervangen door ~/data/log/app.log:
dany@pindabook:~/vervang_test$ ./replace_text.sh "~/data/logs/app.log" "~/data/log/app.log" ~/vervang_test
Vervang in /home/dany/vervang_test ~/data/logs/app.log door ~/data/log/app.log.
Vervanging voltooid.
Controleer het resultaat:
dany@pindabook:~/vervang_test$ grep "~/data/log/app.log" *
config.env:ERROR_LOG="~/data/log/app.log"
process.sh:echo "Processing ~/data/log/app.log"
script1.sh:Log file: ~/data/log/app.log
En ga na of er geen oude paden meer aanwezig zijn:
dany@pindabook:~/vervang_test$ grep "~/data/logs/app.log" *
Als er geen uitvoer is, is de vervanging gelukt.
Het script:
/, & en andere symbolen worden correct verwerkt.find -exec sed: Veiliger dan grep | xargs sed.{} +).Je kunt dit script nu op echte bestanden gebruiken.
Voorzorgsmaatregelen voordat je het op echte bestanden uitvoert:
~/vervang_test.grep -rl "~/data/logs/app.log" ~/vervang_test/ uitvoeren.dany@pindabook:~/vervang_test$ cd
dany@pindabook:~$ rm -r vervang_test/