Beginner's Guide to Sed [Linux]
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.