Nybörjarens Guide till Sed [Linux]
Efter grep är nästa logiska steg en handledning om sed. Sed-kommandot kommer från Stream EDitor, och som namnet indikerar handlar det om textflöde. Men om sed är en av de mest kraftfulla kommandona i Unix, är dess manuella sida också bland de mest gåtfulla. Jag kommer att försöka i denna artikel att sammanfatta den mest grundläggande användningen av sed och ge dig några exempel på avancerade skript.
Grunderna
Det allmänna kommandot för sed är något som:
sed [alternativ] '{script}' [textfil]
Sed kommer att utföra de operationer som du vill att han ska göra i textfilen och visa resultatet i standardutmatningen. Om du vill ha resultatet i en textfil kan du antingen omdirigera det via vanliga metoden:
sed [alternativ] '{script}' [textfil]> [redigerad textfil]
Eller använd alternativet " -i
" som direkt redigerar inmatningsfilen:
sed -i [alternativ] '{script}' [textfil]
Nu börjar vi arbeta med manuset. Det mest uppenbara första steget är nollskriptet:
sed '' test.txt
kommer bara att visa texten i test.txt.
En bra användning av sed är borttagning. Låt oss träna genom exempel.
sed '2, 4 d' test.txt
raderar raderna 2 till 4 i test.txt.
Du kan gissa att syntaxen för manuset är:
sed '[första raden att ta bort] [sista raden att ta bort] d' test.txt
Men den fina delen kommer när du använder vanliga uttryck, eller regex, som avgränsare för radering. Till exempel,
sed '/ ^ # / d' test.txt
kommer att radera varje rad som börjar med "#" (med andra ord, om du kodar kommer den ta bort alla dina kommentarer).
Den allmänna syntaxen är
sed '/ regex / d' test.txt
för att radera linjen som innehåller regexen.
sed '/ regex1 /, / regex2 / d' test.txt
för att radera intervallet från raden som innehåller regex1 till linjen som innehåller regex2.
Det speciella tecknet "^" som jag använde i det första exemplet är att ange början på raden.
Då är den andra grundläggande användningen jag kan tänka på substitution. Den allmänna syntaxen är:
sed-re 's / regex1 / regex2 /' test.txt
Det kommer att ha effekt för att söka i den första raden för regex1, ersätta den med regex2, gå till nästa rad och upprepa till slutet av inmatningsflödet.
Ett bra exempel är:
sed-re s / ^ # * // 'test.txt
Det kommer att ersätta symbolen "#" i början av en rad och alla tomma mellanslag med ingenting. Med andra ord är det oklanderlig textfilen. Symbolen "*" är en metakaraktär som utformar 0 eller flera tomma utrymmen här.
Avancerad
Du kan göra några snygga saker med sed, men du når gränsen ganska snabbt om du inte uppmärksammar det grundläggande beteendet. Sed behandlar flöde linjärt: Det applicerar en linje-för-linje behandling till en textfil. Om du vill göra mer än en ändring till samma rad måste du använda etiketter och flervalsbehandling. Allt detta kan bli väldigt komplext, väldigt snabbt. Jag ska nu visa dig några avancerade exempel och förklara dem för dig. Om du vill ha mer, är jag säker på att du kan söka själv och använda grunderna som jag gav dig.
Om du vill radera de tomma raderna i en fil kan du använda kommandot
sed-re '/ ^ $ / {N; D} 'test.txt
Meta-teckenet "$" betyder slutet av raden, så "^ $" designar en tom linje. Då är "{N; D}" en ganska komplex syntax för att säga radera den raden.
Om du vill radera varje tagg i en html-fil, är detta kommandot för dig:
sed -re ': start s /] *> // g; /"Starten" heter en etikett. Det är lite som en etikett inom skriptet som vi vill gå tillbaka till senare för att kunna tillämpa flera ändringar på samma rad. sed söker efter något av formuläret "" (regexen) *>) och ersätter det med ingenting, så den första html-taggen på raden raderas. Men sedan, innan du går till nästa rad, kontrollerar den om det finns något annat som börjar med "<", och om det finns, går det tillbaka till etiketten ": start" och tillämpar behandlingen igen.
Slutsats
Du är nu redo att studera mer djupt sed eller bara använda den för enkla ändringar. Det är ett kommando som jag tycker är särskilt användbart i skript i allmänhet, men det tog mig lite tid att förstå sin syntax. Jag hoppas att det blir mycket snabbare för dig.
Känner du till ett annat grundläggande kommando för sed? Eller använder du ett annat avancerat skript med sed som du vill dela med dig? Vänligen meddela oss i kommentarerna.