Etter grep er det neste logiske trinnet en veiledning på sed. Sed-kommandoen kommer fra Stream EDitor, og som navnet antyder, handler det om tekstflux. Men hvis sed er en av de mest kraftige kommandoene i Unix, er den manuelle siden også blant de mest gåtefulle. Jeg vil prøve i denne artikkelen å oppsummere den mest grunnleggende bruken av sed og gi deg noen få eksempler på avanserte skript.

Grunnleggende

Den generelle kommandoen for sed er noe som:

 sed [alternativ] '{script}' [tekstfil] 

Sed vil utføre operasjonene du vil at han skal gjøre på tekstfilen og vise resultatet i standardutgangen. Hvis du vil ha resultatet i en tekstfil, kan du enten omdirigere den via vanlig metode:

 sed [alternativ] '{script}' [tekstfil]> [redigert tekstfil] 

Eller bruk alternativet " -i " som direkte rediger inngangsfilen:

 sed -i [alternativ] '{script}' [tekstfil] 

La oss begynne å jobbe med skriptet. Det mest åpenbare første trinnet er nullskriptet:

 sed '' test.txt 

vil bare vise teksten i test.txt.

En god bruk av sed er sletting. La oss øve oss gjennom eksempler.

 sed '2, 4 d' test.txt 

vil slette linjene 2 til 4 av test.txt.

Du kan gjette at syntaksen for skriptet er:

 sed '[første linje for å slette] [siste linje for å slette] d' test.txt 

Men den fancy delen kommer når du bruker vanlige uttrykk, eller regex, som delimiter for sletting. For eksempel,

 sed '/ ^ # / d' test.txt 

vil slette hver linje som begynner med "#" (med andre ord, hvis du kode, vil den slette alle kommentarene dine).

Den generelle syntaksen er

 sed '/ regex / d' test.txt 

for å slette linjen som inneholder regex.

 sed '/ regex1 /, / regex2 / d' test.txt 

for å slette intervallet fra linjen som inneholder regex1 til linjen som inneholder regex2.

Spesialtegnet "^" som jeg brukte i det første eksemplet, er å angi begynnelsen på linjen.

Så, den andre grunnleggende bruken som jeg kan tenke på, er substitusjon. Den generelle syntaksen er:

 sed-re 's / regex1 / regex2 /' test.txt 

Det vil ha effekt for å søke i den første linjen for regex1, erstatte den med regex2, gå til neste linje og gjenta til slutten av inngangsfluksen.

Et godt eksempel er:

 sed-re s / ^ # * // 'test.txt 

Det vil erstatte symbolet "#" i begynnelsen av en linje, og alle de tomme mellomromene med ingenting. I andre tilfeller unnlater det tekstfilen. Symbolet "*" er et meta-tegn som designer 0 eller flere tomme mellomrom her.

Avansert

Du kan gjøre noen ganske fulle ting med sed, men du kommer til grensen ganske fort hvis du ikke tar hensyn til sin grunnleggende oppførsel. Sed behandler flux lineært: Det gjelder en linje-for-linje behandling til en tekstfil. Hvis du vil gjøre mer enn en endring på samme linje, må du bruke etiketter og flertallbehandling. Alt dette kan bli veldig komplisert, veldig raskt. Jeg vil nå vise deg noen avanserte eksempler og forklare dem for deg. Hvis du vil ha mer, er jeg sikker på at du kan søke selv og bruke det grunnleggende jeg ga deg.

Hvis du vil slette de tomme linjene i en fil, kan du bruke kommandoen

 sed -re '/ ^ $ / {N; D} 'test.txt 

Meta-tegn "$" betyr slutten av linjen, så "^ $" designer en tom linje. Da er "{N; D}" en ganske kompleks syntaks for å si slette den linjen.

Hvis du vil slette alle tagger i en html-fil, er dette kommandoen for deg:

 sed -re ': start s /] *> // g; / 

"Starten" kalles en etikett. Det er litt som en merke i skriptet som vi vil gå tilbake til senere for å kunne bruke flere endringer på samme linje. sed søker etter noe av skjemaet ("regex" *>) og erstatter det med ingenting, så den første HTML-koden på linjen slettes. Men så, før du går til neste linje, kontrollerer den om det er noe annet som begynner med "<", og hvis det er, går det tilbake til etiketten ": start" og søker på nytt.

Konklusjon

Du er nå klar til å studere mer dypt sed, eller bare bruke den til enkle modifikasjoner. Det er en kommando som jeg finner spesielt nyttig i skript generelt, men det tok meg litt tid å forstå sin syntaks. Jeg håper det blir mye raskere for deg.

Kjenner du en annen grunnleggende kommando for sed? Eller bruker du et annet avansert skript med sed som du vil dele? Gi oss beskjed i kommentarene.