Weekend Prosjekt: Bli kjent GNU Sed

Hvis du noen gang har behov for å endre en eller flere filer for å gjøre raske endringer, har du uten tvil funnet at å gjøre det ved hjelp av en tekst editor kan være en langsom slogging prosess. Linux, heldigvis, har en rekke verktøy som gjør det enkelt å gjøre denne ikke-interaktivt. En av de beste er sed, et " stream redaktør " som kan hjelpe deg å gjøre kort prosess med filtrering og trans tekst. Denne helgen, ta noen minutter å introdusere deg til sed.

Som mange av de verktøyene du vil bruke på Linux, sed oppsto på UNIX for behandling tekstfiler på kommandolinjen eller ved skallskript. Gjennomføringen av sed som du bruker på Linux er sannsynlig GNU sed, men det er langt fra den eneste gjennomføring. Hvis du bruker en av BSDene eller Mac OS X, vil du støte på ulike versjoner av sed. Hvis du bruker et system som bruker Busybox, kan du bruke en annen versjon av sed. For det meste, sed bør handle de samme på tvers av plattformer – men den GNU-versjonen har alternativer som kanskje ikke er til stede med andre implementeringer eller kanskje ikke har samme atferd

Så hva er sed god for, og hva vi mener med ". stream redaktør "? Standard tekstredigeringsprogrammer åpne en fil i en buffer, og du redigere filen som en stor blob av tekst. (Jeg generalisere en wee bit, selvfølgelig.) Når du bruker Vim, Gedit, Kate, eller hva din favoritt teksteditor skjer for å være, du bruker det interaktivt. Du beveger deg rundt i fila litt, gjøre endringer, kjøre kommandoer osv Sed, derimot, er ikke-interaktiv. Du passerer sed de redigeringskommandoer og det fungerer på filer eller en strøm av tekst som sendes ut fra andre programmer.

Du gir ført en rekke adresser og sett av kommandoer, og det går til byen på input – enten det er filer eller tekst som kommer fra en annen prosess. Når jeg sier " adresser, " det er tekst editor sjargong for ". posisjon i filen " For eksempel, linjer 10 gjennom 101 i en fil. Hvis du ikke gir sed bestemte adresser, så det forutsetter bare at du vil ha det til å fungere på hele
fil eller utgang.

Hva er kommandoer? Du vil finne at sed har en rekke kommandoer, men de vanligste at vi skal fokusere på her er substitusjon, sletting og utskrift.

Sed in Practice

Det kan være litt abstrakt, så la oss se på bruk av sed i noen enkle, men reelle scenarier der det kan være fordelaktig. Først, la oss se på den grunnleggende syntaks for sed:

sed alternativ
kommandoen
; Command2
filnavn

Som de fleste verktøy, sed tar ett eller flere alternativer, så kommandoer, og deretter filnavnet som du jobber med. Som du ser, kan du bruke flere kommandoer, og vi skal se på det også.

Si at du ønsker å skumme raskt gjennom en Apache loggfil og se alle de tilfeller der en Atom-feed ble forespurt. Ser gjennom mine språk loggene, ser jeg at det er mange linjer med GET /? Fôr = atom, og jeg vil gjerne se dem og arbeide med dem litt. La oss bruke sed utskriftskommando:

sed -n '/atom /p'

Her du gir sed " stille " alternativ (-n) og fortelle det ikke anbefale å skrive noe mindre spesifikt bedt om. Deretter vil du gjøre et søk etter strengen " atom " (/atom /) og deretter fortelle sed å skrive ut (p) linjer som passer. Du lurer kanskje på hvorfor de apostrof? Det er for å hindre at skallet fra tydning som &. Vi ønsker å gi dem videre til sed, ikke har dem tolket av skallet, fordi vi ville bli ganske uventet oppførsel deretter.

La meg oppmerksom på up-front som sed ikke er bare
verktøy som kan gjøre dette. Du kan lett bruke grep for dette også. Men har grep har magisk søk ​​og erstatt krefter? Det gjør det ikke, men sed gjør.

Hva om du ønsker å gjøre litt rask og skitne tekst erstatning uten å måtte åpne opp Vim? Her er et enkelt eksempel. Jeg ofte rydde opp HTML før du legger inn historier på Linux.com. En ting jeg pleier å gjøre er å erstatte den tankestrek (& ndash;) for to streker (-). For å gjøre dette, kjører:

sed 's /- /\\ & ndash; /g 'filename.html > newfile.html

Hvis du har brukt Vim og tror at utseende virkelig
kjent, du har rett. Her bruker erstatning kommandoen (er) for to streker omgitt av mellomrom, og deretter erstatte dem med & ndash; element. Som med Vim erstatninger, forteller g sed at søket er global
. Uten det, sed ville bare angripe den første forekomsten av søkemønster per linje, og ignorere andre tilfeller.

Det siste argumentet for sed er å fortelle det hvilken fil å analysere, og deretter vi omdirigere utdataene til newfile HTML. Hva skjer hvis vi ikke omdirigere det? Så sed bare spytter den ut til standard utgang, slik at du får se en haug med tekst spytte ut til terminalen.

Du kan endre en fil på plass med sed, hvis du er sikker på hva du 're gjør. Det er en hack, men her er hvordan det fungerer: i-alternativet forteller sed å lage en sikkerhetskopi av en fil og redigere på plass. Tanken er at sed aldri endrer en fil uten å lage en sikkerhetskopi. Dette er smart design – det holder deg fra å gjøre en endring til en fil som horks filen og er uopprettelig. Husk sed er ikke-interaktive, derfor har det ingen angre
. Ingen. Men til tider kan det være lurt å redigere en fil på plass uansett, så her er hvordan:

sed -i '' -e 's /foo /bar /g' filnavn

Det gir sed et tomt uttrykk å bruke som en backup filnavn. Normalt ville du bruke noe sånt -i'.bak '. Merk at du ikke vil ha et mellomrom mellom -i og uttrykket.

-e alternativet forteller sed at det som følger neste er et script eller uttrykk for å vurdere. Igjen, følger ingen plass på -e og uttrykk, eller sed vil anta at det som følger neste er et filnavn. Ja, det kan være litt kresen.

La oss ta en titt på d (slette) kommando- og adresseområder. La oss si at du vil slette linjer 10 gjennom 100 i en fil:

sed -i '' -e'10,100d ' filnavn

som forteller sed å redigere filen på plass, så å slette området 10 gjennom 100. Igjen, hvis dette området ser kjent ut, er det fordi det er det samme syntaks brukes med Vim.

Hva om du ønsket å skrive ut området i stedet? Husk at vi bare vil området som er spesifisert, så vi ønsker -n alternativet, som så:

sed -n '10, 100 p filnavn

Bare begynnelsen

Gjør forstand? Det vi har lært om sed så langt. Hvordan å erstatte tekst, print tekst og slette tekst fra en fil

Dette er bare toppen av isfjellet, ikke bare av hva du kan gjøre med sed men også av tekstbehandling krefter verktøy på Linux. Det er mer grunn til å dekke med sed, glaner, og mer. Vi skal dekke mer av sed snart, men i mellomtiden bør du sjekke ut mannen siden og se over denne massive sed opplæringen. Neste opp? Vi skal se på sed regulære uttrykk og hvordan du bruker dem.

Du kan også være lurt å sjekke ut tutorial på GNU verktøy og læring GNU tekst verktøy opplæringen. Begge disse vil hjelpe deg med noen av de grunnleggende GNU verktøy du kan bruke til å behandle tekst. Anmeldelser