Linux-kommandon och skalfärdigheter
sed: Redigera strömmar utan att öppna en redigerare
sed redigeringar i sidled: hela textströmmar passerar genom den, kommer ut transformerade och ingen redigerare öppnas. Dess rykte kommer från -i, som förvandlar en enradsersättning till en batchoperation över tusentals filer, och från katastrofberättelser om administratörer som körde den utan ett backupsuffix. Det säkra arbetsflödet ändras aldrig: kör substitutionen synlig, bekräfta utdata, lägg sedan till -i med ett suffix och behåll utgångskoden.
Nyckelpunkter
- Förhandsgranska innan du commit: sed -n '10,20p'-fil visar ett radintervall, och samma -n plus p-kombination skriver bara ut rader som matchar ett regex eller adress.
- Ersätt med flaggor som gör det du menar: s/old/new/g för alla matchningar, ett nummer som 2g för bara den andra och -E för utökat regex utan en sida med snedstreck.
- Redigeringar på plats får ett suffix, inga undantag: sed -i.bak 's/http://https:/g'-appen håller en säkerhetskopia med samma namn bredvid varje ändring; det suffixet har räddat fler installationer än någon redaktörs ångrahistorik.
- Avgränsare är gratis: s|/var/www|/srv/app|g (eller s#...#g) undviker slagsmål som undviker snedstreck när ditt mönster är fullt av vägar.
- -i är inte atomär: en krasch eller ett dåligt regex i mitten av batchen lämnade en gång halvskrivna filer bakom sig, så massjobb körs mot kopior eller git-tracked trees, aldrig den enda kopian.
- GNU och BSD sed är oense om -i: BSD kräver suffixet innan skriptet (sed -i '' fungerar på macOS, är inte en Linux-syntax), vilket är ytterligare en anledning till att portabilitetsskript undviker -i helt.
- Ta bort och isolera är ärliga verb: 'd' tar bort matchande rader (sed '/^#/d' remsar kommentarer), och -n med ett intervall isolerar ett avsnitt; båda läser bättre än smarta byten.
- Allt tidigare redigeringar på en rad, bokstavliga flerradsblock eller tillståndsfulla kopplingar hör hemma i awk eller ett riktigt skript; Att tvinga sed att utföra programmeringsarbete är hur oläsliga one-liners föds.
Fältnotis
Min första sed -i utan ett .bak-suffix träffade en produktions-nginx-konfiguration precis före eftermiddagens trafiktopp. Sedan dess har varje redigering på plats ett backup-suffix, och jag läser torrkörningen innan -i ens närmar sig kommandot.
Vanliga frågor
Hur redigerar jag bara rader som matchar något annat?
Adressera dem: sed '/cache/s/true/false/' vänder sann till falsk endast på cache-rader, och intervall som '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g' omfångsredigeringar till block; adressen går först, kommandot därefter.
Varför kommer sed inte att matcha ändarna på raderna i en Windows-redigerad fil?
Dessa rader slutar med vagnretur-tecken som '$'-ankarna inte förväntar sig; strippa dem med tr först eller normalisera på vägen in, och flerradsinnehåll hör fortfarande hemma i awk eller Perl med -0777.
Är sed snabbare än awk för enkla ersättningar?
Marginellt och irrelevant; båda slutar på millisekunder på filer i konfigurationsstorlek. Välj efter läsbarhet, eftersom en kollega måste ta bort din one-liner på sex månader.
Kan jag infoga hela konfigurationsblock med sed?
Ja: 'a' läggs till efter, 'i' infogar före och 'c' ersätter raden, men håll den infogade texten enkel och ensidig; riktiga block hör hemma i en mallfil eller ett korrekt provisioneringssteg.
Så hjälper Kinetikatech dig med linux-kommandon och skalfärdigheter
Ärligt talat kommer de flesta team till oss efter att ha försökt själva först: Kommandon och skriptvanor som avgör om en administratör driver en server eller bekämpar den: sök, transformera, överföra och övervaka text och processer med verktygen som finns i varje basinstallation. Vår Linux-serversäkerhet och Serverhantering-tjänst finns så att du slipper lära dig linux-kommandon och skalfärdigheter den hårda vägen, vi tar installationen, bevakningen och överraskningarna klockan tre på morgonen.