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.