Tutoriel Linux

Sed onder Linux: tekst in een bestand vervangen zonder het origineel te beschadigen

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

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.

Tux controleert een Linux-bestand voordat tekst met sed wordt vervangen.
Test een sed-vervanging altijd eerst voordat je het originele bestand wijzigt.

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.

sudo apt update && sudo apt upgrade