Sed - strömredigerare för filtrering och omvandling av text
Sed kommandot är som vim ganska knepigt att lära sig men när man får koll på det så kan man underlätta sitt arbete med shell script extremt mycket.
När man ska manipulera och omvandla texter så är sed ett av de bästa verktygen i Linux. Jag ska försöka använda mig av bra kompatibilitet så att det funkar på så många installationer som möjligt. Därför har jag testat dessa kommandon på asus wrt som har en äldre busybox installation.
Argument till kommandot
-e Kör flera editeringar efter varandra. Jag rekommenderar att man kör sed 's/byt/till/; s/byt/till/' fil.txt istället för sed -e 's/byt/till/' -e 's/byt/till/' fil.txt. Blir både kortare och bättre med ; istället för -e.
-n Stäng av automatisk print till standar ut. Använd sed -n 'p' för att få ut text.
Kommandon
För att skicka text till sed (standard input) så finns det olika sätt att göra detta på. Här ser du fyra exempel på detta.
< fil.txt sed -n '2,3p'
sed -n '2,3p' fil.txt
cat fil.txt | sed -n '2,3p'
printf 'Lite text' | sed -n 's/text/sed/p'
Printa rad 4 till 6.
sed -n '4,6p' fil.txt
Radera rad 2 till 4 och printa sedan.
sed -n '2,4d;p' fil.txt
Tre exempel på att byta ut ordet byt till ordet till fast bara på rad 10 till 13. Det första exemplet byter ut det i texten och sedan printar hela texten medans det andra bara printar det som lyckats blivit utbytt. /p är en specialare som bara printar det den matchar på när man byter ut saker eller söker efter dem. Tredje exemplet gör samma som första men bryr sig ej om det är exakt match på stora och små bokstäver.
sed -n '10,13s/byt/till/;p' fil.txt
sed -n '10,13s/byt/till/p' fil.txt
sed -n '10,13s/byt/till/I;p' fil2.txt
Detta fungerar som grep att man letar efter hitta och sedan printar det som matchar. Det andra alternativet gör som den första men lägger till 10 rader efter matchen. Det tredje alternativet begränsar sökningen från rad 4 till 10. Det fjärde exemplet tar rader från försa <p> taggen till sista </p> taggen och sedan söker efter rader med <b> som den sedan tar bort och printar resten. Så en begränsning med {} kan sättas upp med både 4,10 eller ord och taggar.
sed -n '/hitta/p' fil.txt
sed -n '/hitta/,+10p' fil.txt
sed -n '4,10{/hitta/p}' fil.txt
sed -n '/<p>/,/<\/p>/{/<b>/d;p}' fil.txt
d är använbart i många fall. Första exemplet är för att ta bort allt efter en match. När man använder ! så blir det tvärt om. Andra exemplet tar bort allt före en match.
sed -n '/hitta/,$d;p' fil.txt
sed -n '/hitta/,$!d;p' fil.txt
q är riktigt bra om du vill sluta läsa in data. Då kan du genom flera q leta efter ett ställe och sedan ett annat och printa resten. Observera att om du vill ha med sista raden som den stannar på så måste du lägga in p före q.
sed -n '/hitta/q;/hitta2/q;p' fil.txt
sed -n '/hitta/q;p;/hitta2/q' fil.txt
Här har vi några exempel på saker som skrivs ut 1. Första raden. 2. Femte raden. 3. Sista raden. 4. Sista radens nummer. 5. Sista radens nummer och innehåll. 6. Alla radnummer och innehåll.
sed -n '1p' fil.txt
sed -n '5p' fil.txt
sed -n '$p' fil.txt
sed -n '$=' fil.txt
sed -n '$=p' fil.txt
sed -n '=p' fil.txt
När man har med n inom ' ' så hoppar man över en rad för varje rad. Detta betyder att varannan rad skriver ut radnumret. Den andra exemplet skriver ut varannan rad. Du kan hoppa över 3 rader för varje rad med sista exemplet.
sed -n '=;n' fil.txt
sed -n 'n;p' fil.txt
sed -n 'n;n;n;p' fil.txt
Det finns fall där man måste använda -e istället för ;. Detta när man lägger till text ovanför, under eller byter ut en rad. -ne behövs bara på första. sedan kan du fortsätta som vanligt. Anledningen till detta är att man kan inte lägga några ; tecken efter texten som man lägger till för då läggs den bara till som text istället för att köra nästa kommando.
sed -ne '/3/aLite ny text under rad 3' -e 'p' fil2.txt
sed -ne '/3/cLite ny text istället för rad 3' -e 'p' fil2.txt
sed -ne '/3/iLite ny text ovanför rad 3' -e 'p' fil2.txt
För att förstå N/P/D så är det bäst att kolla på video 2 från 7:44. N lägger in nästa till patten space och P printar första från patten space samt D som tar bort första från patten space.
För att förstå script, -f och # så är det bäst att kolla video 3 från 4:45.
För att förstå holding space och x/h/H/g/G så är det bäst att titta på video 4 från 5:37.
För att förstå holding space och :/b/t så är det bäst att titta på video 4 från 13:05.
Filmer och sed editorn
Dessa måste vara de bästa filmerna om man skall lära sig sed.
Understanding how sed works 1/4
Understanding how sed works 2/4
Understanding how sed works 3/4
Understanding how sed works 4/4
Tips
Ibland så kan det vara bra att använda andra avskiljare än / i sed för att det krockar. Ett tecken som jag tycker är bra är | (pipe). Om man behöver använda variabler så kan man lösa det som i andra exemplet.
sed -n '10,13s|byt|till|;p' fil.txt
sed -n "10,13s|$byt|$till|;p" fil.txt
Man kan göra så många saker med sed och det går inte att ta upp allt. Men efter du har läst detta och även sett på filmerna så kommer du förstå sed mycket bättre än innan.