Tekst in een Linux-bestand vervangen door sedHet is erg handig. Maar het is ook zo’n commando dat een configuratiebestand binnen een seconde kan beschadigen als je het direct uitvoert. sed -i slecht herlezen.
Ik raad je aan een simpele gewoonte aan te nemen: lezen voordat je schrijftWe testen de vervanging op de standaarduitvoer, leiden deze om naar een tijdelijk bestand, controleren het verschil en vervangen pas daarna het origineel. Het duurt iets langer, maar op een server voorkomt het onnodige reparaties.

Inzicht in wat sed daadwerkelijk verandert
sed Het leest een tekststroom, past een regel toe en geeft vervolgens het resultaat weer. Standaard wordt het bronbestand niet gewijzigd. Dit is precies het gedrag dat je wilt gebruiken bij het testen van een commando.
sed 's/old/new/' file.conf
Deze opdracht vervangt de eerste keer dat deze voorkomt. oud door nieuw op elke weergegeven regel. Het bestand bestand.conf blijft intact. Je kunt het resultaat dus bekijken zonder enig risico te lopen.
Als je alle voorkomende gevallen op een regel wilt vervangen, voeg dan de vlag toe. G :
sed 's/old/new/g' file.conf
De klassieke valkuil is om de twee te verwarren. Zonder G`sed` vervangt alleen de eerste keer dat elke regel voorkomt. Met GHet vervangt alle voorkomende gevallen op de regel.
Test het bestand eerst in een nieuw bestand voordat je het origineel aanraakt.
Voor een configuratiebestand maak ik het liefst een testbestand aan. Zo houd je het origineel bij de hand en kun je het op je gemak vergelijken.
sed 's/old/new/g' file.conf > file.conf.new
diff -u file.conf file.conf.new
DE diff-u Het laat je precies zien welke regels zijn gewijzigd. Als het resultaat correct is, kun je het oude bestand vervangen.
verplaats bestand.conf naar nieuw bestand.conf
Maak voor gevoelige bestanden altijd een gedateerde kopie voordat u ze aanraakt:
cp fichier.conf fichier.conf.bak-$(datum +%F-%H%M)
Het is geen echte back-upstrategie, maar het is vaak voldoende om na een kleine vervangingsfout terug te keren naar de vorige staat.
Gebruik sed -i zonder met vuur te spelen.
De optie -i Het wijzigt het bestand direct. Dat is handig, maar ik zou het nooit op een belangrijk bestand toepassen zonder een back-up of voorafgaande test.
De minimale vereiste is om sed te vragen een back-upkopie te maken:
sed -i.bak 's/old/new/g' file.conf
Je ontvangt dan het aangepaste bestand, plus een kopie. bestand.conf.bakAls de vervanging iets heeft beschadigd, kun je het snel herstellen:
mv fichier.conf.bak fichier.conf
Op sommige distributies of op macOS is het gedrag van sed -i kan variëren. Op Linux GNU sed, -i.bak Werkt prima. Als je een procedure schrijft die bedoeld is voor meerdere systemen, test deze dan altijd eerst op een kopie.
Een pad vervangen zonder gedoe met schuine strepen.
Wanneer de keten bevat /De klassieke syntaxis wordt al snel onleesbaar:
sed 's#/var/www/html#/srv/www/site#g' nginx.conf > nginx.conf.test
Hier gebruik ik # als scheidingselement in plaats van /De opdracht blijft duidelijker en je vermijdt een reeks omslachtige escape-bewerkingen. Dit is erg handig voor paden, URL’s of bepaalde configuratievariabelen.
Controleer de betreffende regels voordat u deze wijziging toepast op een Nginx-, Apache- of applicatiebestand:
diff -u nginx.conf nginx.conf.test
grep -n '/srv/www/site' nginx.conf.test
Als u een serviceconfiguratie wijzigt, voer dan ook een servicespecifieke test uit voordat u de service opnieuw opstart. Sed vervangt tekst; het valideert niet de syntaxis van uw applicatie.
Toon alleen de relevante rijen
Om een bestand te inspecteren voordat u het wijzigt, kunt u het volgende combineren: sed En grepAls u een reeks rijen wilt weergeven:
sed -n '1,80p' file.conf
DE -N Voorkomt dat het hele bestand wordt weergegeven. P Het print alleen het gevraagde bereik. Dit is handig voor het beheren van een specifiek gebied in een lange configuratie.
Om de lijnen weer te geven die overeenkomen met een patroon:
sed -n '/server_name/p' nginx.conf
Als uw voornaamste behoefte is om binnen bestanden te zoeken, grep blijft vaak natuurlijker.Sed wordt interessant wanneer je het resultaat moet transformeren, en niet alleen moet vinden.
Wijzig meerdere bestanden met de nodige voorzichtigheid.
Sed kan je snel verleiden om een hele map te wijzigen. In dat geval raad ik je aan om het rustig aan te doen. Begin met het weergeven van de bestanden die daadwerkelijk de tekenreeks bevatten waarnaar je op zoek bent:
grep -rl 'old' /etc/my-app
Voer vervolgens een lus uit die elk bestand opslaat voordat het wordt vervangen:
grep -rl 'old' /etc/my-app | while read -r file; do
cp "$file" "$file.bak"
sed -i 's/ancien/nouveau/g' "$file"
klaar
Dit is geen opdracht om zomaar blindelings te kopiëren. /enzPas de map aan, controleer de lijst met grep-rlWerk vervolgens binnen een beperkt bereik. Om naar bestanden te zoeken voordat je actie onderneemt, kun je ook gebruikmaken van vinden op Linux.
Controles na vervanging
Na een wijziging moet u niet zomaar aannemen dat de bestelling is geplaatst. Controleer in ieder geval de volgende punten:
- de aanwezigheid van de nieuwe waarde met
grep -n 'new' file.conf; - de afwezigheid van de oude waarde met
grep -n 'old' file.conf; - het verschil tussen het originele en het gewijzigde bestand als je een kopie hebt bewaard;
- de syntaxtest van de betreffende applicatie, indien aanwezig;
- De servicelogboeken na het herladen of herstarten.
Houd er bij het bijhouden van logbestanden rekening mee dat u live moet monitoren wat er gebeurt. staart Of journalctl -fSed kan een waarde corrigeren, maar alleen de service zelf kan je vertellen of de configuratie nog steeds geldig is.
Wanneer moet je sedatie vermijden?
Sed is perfect voor eenvoudige vervangingen in een tekstbestand. Ik zou het echter afraden om het te gebruiken voor het wijzigen van een gestructureerd bestand als de volgorde, blokken of aanhalingstekens cruciaal zijn. Voor JSON, complexe YAML, XML of zeer gevoelige configuraties is een speciaal hulpmiddel of een klein script wellicht veiliger.
Als u een migratie of een correctie voorbereidt die meerdere bestanden betreft, maak dan vooraf een volledige back-up. Een archief of lokale kopie kan een tijdelijke oplossing zijn, maar voor een echte, regelmatige back-up kunt u het beste een betrouwbare methode gebruiken, zoals een archief. rsync.
Om nog verder te gaan, de GNU sed-handleiding en de pagina sed(1) van man7.org Wat overblijft zijn de nuttige referenties. Die zijn minder handig dan een praktisch voorbeeld, maar ze verduidelijken snel de mogelijkheden wanneer je verder gaat dan simpele vervangingen.