Linux-opdrachten en shell-vaardigheden
sed: Streams bewerken zonder een editor te openen
sed bewerkt zijwaarts: hele tekststromen gaan er doorheen, komen er getransformeerd uit, en er wordt geen editor geopend. De reputatie komt van -i, dat een vervanging van één regel omzet in een batchbewerking voor duizenden bestanden, en van de rampverhalen van beheerders die het uitvoerden zonder een back-upachtervoegsel. De veilige workflow verandert nooit: voer de vervanging zichtbaar uit, bevestig de uitvoer, voeg vervolgens -i toe met een achtervoegsel en bewaar de exitcode.
Kernpunten
- Bekijk een voorbeeld voordat je commit: sed -n '10,20p' bestand toont een regelbereik, en dezelfde -n plus p combinatie drukt alleen regels af die overeenkomen met een regex of adres.
- Vervang dit door vlaggen die doen wat je bedoelt: s/oud/nieuw/g voor alle overeenkomsten, een getal als 2g voor slechts de seconde, en -E voor uitgebreide regex zonder een pagina met backslash-escapes.
- In-place bewerkingen krijgen een achtervoegsel, geen uitzonderingen: sed -i.bak 's/http:/https:/g' app bewaart een back-up met dezelfde naam naast elke wijziging; dat achtervoegsel heeft meer implementaties gered dan de geschiedenis van welke editor dan ook.
- Scheidingstekens zijn gratis: s|/var/www|/srv/app|g (of s#...#g) vermijdt slash-escaping-gevechten als je patroon vol paden is.
- -i is niet atomair: een crash of een slechte regex halverwege de batch liet ooit half herschreven bestanden achter, dus bulktaken worden uitgevoerd tegen kopieën of door git bijgehouden bomen, nooit de enige kopie.
- GNU en BSD sed zijn het niet eens over -i: BSD vereist het achtervoegsel vóór het script (sed -i '' werkt op macOS, is geen Linux-syntaxis), wat nog een reden is waarom portabiliteitsscripts -i volledig vermijden.
- Verwijderen en isoleren zijn eerlijke werkwoorden: 'd' verwijdert overeenkomende regels (sed '/^#/d' verwijdert commentaar), en -n met een bereik isoleert een sectie; beide lezen beter dan slimme vervangingen.
- Alles behalve bewerkingen van één regel, letterlijke blokken van meerdere regels of stateful joins hoort thuis in awk of een echt script; door sed te dwingen programmeurswerk te doen, ontstaan onleesbare oneliners.
Notitie uit de praktijk
Mijn eerste sed -i zonder het achtervoegsel .bak bereikte een productie-nginx-configuratie vlak voor de middagverkeerspiek. Sindsdien heeft elke interne bewerking een back-upachtervoegsel, en ik lees de uitvoer van de proefbewerking voordat de -i zelfs maar in de buurt van de opdracht komt.
Veelgestelde vragen
Hoe bewerk ik alleen regels die met iets anders overeenkomen?
Adresseer ze: sed '/cache/s/true/false/' verandert true alleen in false op cacheregels, en bereiken als '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g' scope-bewerkingen naar blokken; het adres komt als eerste, het commando als tweede.
Waarom komt sed niet overeen met de uiteinden van regels in een door Windows bewerkt bestand?
Deze regels eindigen met 'carriage-return'-tekens die de '$'-ankers niet verwachten; strip ze eerst met tr of normaliseer ze onderweg, en inhoud met meerdere regels hoort nog steeds thuis in awk of Perl met -0777.
Is sed sneller dan awk voor eenvoudige vervangingen?
Marginaal en irrelevant; beide eindigen in milliseconden op bestanden van configuratieformaat. Kies op leesbaarheid, want een collega moet in een half jaar jouw oneliner ontwarren.
Kan ik hele configuratieblokken invoegen met sed?
Ja: 'a' wordt erna toegevoegd, 'i' wordt ervoor ingevoegd en 'c' vervangt de regel, maar houd de ingevoegde tekst eenvoudig en voor één doel; echte blokken horen thuis in een sjabloonbestand of een goede inrichtingsstap.
Hoe Kinetikatech helpt bij linux-opdrachten en shell-vaardigheden
Dit hebben wij al honderden keren opgelost: De opdrachten en scriptgewoonten die beslissen of een beheerder een server beheert of bestrijdt: tekst en processen zoeken, transformeren, overdragen en controleren met de tools die in elke basisinstallatie aanwezig zijn. Met Linux-serverbeveiliging en Serverbeheer krijgt u de volledige cyclus: wij beoordelen, implementeren, bewaken dag en nacht en reageren binnen 30 minuten als het erop aankomt.