Begynder's Guide to Sed [Linux]
Efter grep er det næste logiske trin en tutorial på sed. Kommandoen sed kommer fra Stream EDitor, og som navnet angiver, handler det om tekstflux. Men hvis sed er en af de mest kraftfulde kommandoer i Unix, er dens manuelle side også blandt de mest gådefulde. Jeg vil prøve i denne artikel at opsummere den mest basale brug af sed og så give dig et par eksempler på avancerede scripts.
Grundlæggende
Den generelle kommando for sed er noget som:
sed [option] '{script}' [tekstfil]
Sed vil udføre de operationer, som du vil have ham til at gøre i tekstfilen og vise resultatet i standard output. Hvis du vil have resultatet i en tekstfil, kan du enten omdirigere det via den sædvanlige metode:
sed [option] '{script}' [tekstfil]> [redigeret tekstfil]
Eller brug indstillingen " -i
", som direkte redigerer inputfilen:
sed -i [option] '{script}' [tekstfil]
Lad os nu begynde at arbejde på scriptet. Det mest oplagte første skridt er null scriptet:
sed '' test.txt
vil bare vise teksten i test.txt.
En god brug af sed er sletning. Lad os øve gennem eksempler.
sed '2, 4 d' test.txt
vil slette linjerne 2 til 4 i test.txt.
Du kan gætte, at syntaksen til scriptet er:
sed '[første linje for at slette] [sidste linje for at slette] d' test.txt
Men den fancy del kommer, når du bruger regulære udtryk, eller regex, som afgrænsning for sletningen. For eksempel,
sed '/ ^ # / d' test.txt
vil slette hver linje, der begynder med "#" (med andre ord, hvis du kode, vil det slette alle dine kommentarer).
Den generelle syntaks er
sed '/ regex / d' test.txt
for at slette linjen indeholdende regex.
sed '/ regex1 /, / regex2 / d' test.txt
for at slette intervallet fra linjen indeholdende regex1 til linien indeholdende regex2.
Specialtegnet "^", som jeg brugte i det første eksempel, er at angive begyndelsen af linjen.
Så den anden grundlæggende brug, jeg kan tænke på, er substitution. Den generelle syntaks er:
sed-re 's / regex1 / regex2 /' test.txt
Det vil have til virkning at søge i den første linje for regex1, erstatte den med regex2, gå til næste linje og gentag til slutningen af indtastningsfluxen.
Et godt eksempel er:
sed-re s / ^ # * // 'test.txt
Det erstatter symbolet "#" i begyndelsen af en linje, og alle de tomme mellemrum med ingenting. Med andre ord er det utilfredsstillende tekstfilen. Symbolet "*" er et meta-tegn, der designer 0 eller flere tomme mellemrum her.
Fremskreden
Du kan gøre nogle flotte ting med sed, men du vil nå grænsen temmelig hurtigt, hvis du ikke er opmærksom på dens grundlæggende adfærd. Sed behandler flux lineært: Den anvender en linje-for-linje behandling til en tekstfil. Hvis du vil gøre mere end en ændring til samme linje, skal du bruge etiketter og behandling med flere linjer. Alt dette kan blive meget komplekst, meget hurtigt. Jeg vil nu vise dig et par avancerede eksempler og forklare dem for dig. Hvis du vil have mere, er jeg sikker på at du kan søge alene og bruge det grundlæggende, jeg gav dig.
Hvis du vil slette de tomme linjer i en fil, kan du bruge kommandoen
sed -re '/ ^ $ / {N; D} 'test.txt
Meta-karakteren "$" betyder slutningen af linjen, så "^ $" designer en tom linje. Derefter er "{N; D}" en ret kompleks syntaks for at sige slette den linje.
Hvis du vil slette hvert tag i en html-fil, er dette kommandoen til dig:
sed -re ': start s /] *> // g; /"Start" kaldes en etiket. Det er lidt som et mærke inden for scriptet, som vi vil gå tilbage til senere for at kunne anvende flere ændringer på samme linje. sed søger efter noget af formularen ("regex" *>) og erstatter det med ingenting, så den første html-kode på linjen slettes. Men inden den går til næste linje, kontrollerer den, om der er noget andet, der begynder med "<", og hvis det er, går det tilbage til etiketten ": start" og genbruger behandlingen.
Konklusion
Du er nu klar til at studere mere dybt sed, eller bare bruge den til enkle ændringer. Det er en kommando, som jeg finder særligt nyttige i script generelt, men det tog mig tid til at forstå sin syntaks. Jeg håber, det vil være meget hurtigere for dig.
Kender du en anden grundlæggende kommando til sed? Eller bruger du et andet avanceret script, der involverer sed, som du vil dele? Lad os vide det i kommentarerne.