HANDIGE EEN-REGELIGE SCRIPTS VOOR SED (Unix stream editor) Dec. 29, 2005 Samengesteld door Eric Pement - pemente[at]northpark[dot]edu version 5.5 Vertaald door Harm Ensing - harm.ensing[at]atosorigin[dot]com HANDIGE SED REGELS DOOR MARTEN VAN DIJK: # Op de eerste regel van het bestand iets.txt # het woordje 'voorbeeld' plaatsen. # Voor de tweede regel zou dit '2i' worden. sed '1ivoorbeeld' iets.txt # Het woordje 'woord' niet meenemen in de selectie # en de zin 'regex' en de rest van de regel (.*) # vervangen door alleen het woordje 'regex'. sed -En '/woord/d;s/regex.*/regex/p' HANDIGE SED REGELS DOOR ERIC PEMENT: REGELAFSTAND: # alle regels scheiden door een lege regel sed G # In een bestand dat al lege regels bevat alle regels scheiden door # een lege regel. Het resultaat mag niet meer dan een lege regel # tussen de tekstregels bevatten. sed '/^$/d;G' # tekstregels scheiden door twee lege regels. sed 'G;G' # lege regels verwijderen, er vanuit gaande dat de even genummerde # regels de lege regels zijn. sed 'n;d' # een regel invoegen boven iedere regel die voldoet aan "regex" sed '/regex/{x;p;x;}' # een regel invoegen onder iedere regel die voldoet aan "regex" sed '/regex/G' # een regel invoegen boven en onder iedere regel die voldoet aan "regex" sed '/regex/{x;p;x;G;}' NUMMERING: # nummer iedere regel eenvoudig links aansluitend # Gebruik van tab (zie opmerking over '\t' aan het eind van dit bestand) # in plaats van spatie houdt de marge in stand. sed = filename | sed 'N;s/\n/\t/' # nummer iedere regel, nummer aan linkerkant en rechts-aansluitend sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # nummer iedere regel, maar alleen als regel niet leeg is sed '/./=' filename | sed '/./N; s/\n/ /' # tel het aantal regels (emuleert unix commando "wc -l") sed -n '$=' TEKST CONVERSIE EN VERVANGING: # IN UNIX OMGEVING: vervang DOS regeleinde (CR/LF) door Unix formaat. sed 's/.$//' # er vanuit gaande dat alle regels eindigen met CR/LF sed 's/^M$//' # in bash/tcsh, druk achtereenvolgens op Ctrl-V en Ctrl-M sed 's/\x0D$//' # werkt in ssed en gsed versie 3.02.80 of hoger # IN UNIX OMGEVING: vervang Unix regeleinde (LF) door DOS formaat. sed "s/$/`echo -e \\\r`/" # commando regel onder ksh sed 's/$'"/`echo \\\r`/" # commando regel onder bash sed "s/$/`echo \\\r`/" # commando regel onder zsh sed 's/$/\r/' # gsed versie 3.02.80 of hoger # verwijder voorafgaande witruimte (spatie en tab) van het begin van # iedere regel. Dit zorgt voor uitlijning van de tekst aan de linkerkant. sed 's/^[ \t]*//' # zie opmerking over '\t' aan het eind. # verwijder afsluitende witruimte (spatie en tab) van het einde # van iedere regel. sed 's/[ \t]*$//' # zie opmerking over '\t' aan het eind van dit bestand. # verwijder zowel voorafgaande als afsluitende witruimte van ieder regel. sed 's/^[ \t]*//;s/[ \t]*$//' # voeg vijf spaties in aan het begin van iedere regel. sed 's/^/ /' # sluit alle tekst rechts aan op een breedte van 79 kolommen. sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # stel in op 78 plus 1 spaties # Centreer tekst op een breedte van 79 kolommen. In methode een # worden spaties aan het begin van een regel meegerekend en worden # afsluitende spaties toegevoegd aan het einde van de regel. # In methode twee worden voorafgaande spaties niet meegenomen en wordt # de regel aan het einde niet aangevuld met spaties. sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # methode een sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # methode twee # zoek en vervang "foo" door "bar" op ieder regel. sed 's/foo/bar/' # vervangt iedere eerste "foo" op een regel sed 's/foo/bar/4' # vervangt aleen iedere vierde "foo" sed 's/foo/bar/g' # vervangt iedere "foo" in een regel sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # vervangt de op-een-na-laatste sed 's/\(.*\)foo/\1bar/' # vervangt alleen de laatste "foo" # vervang "foo" door "bar", maar alleen op regels die "baz" bevatten. sed '/baz/s/foo/bar/g' # vervang "foo" door "bar", maar NIET op regels die "baz" bevatten. sed '/baz/!s/foo/bar/g' # vervang "scarlet" of "ruby" of "puce" door "red". gsed 's/scarlet\|ruby\|puce/red/g' # alleen GNU sed sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # meeste seds # print regels in omgekeerde volgorde (emuleert "tac"). # NB: door een bug in HHsed v1.5 worden lege regels verwijderd. sed '1!G;h;$!d' # methode een sed -n '1!G;h;$p' # methode twee # print karakters op een regel in omgekeerde volgorde (emuleert "tac"). sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' # voeg regels twee-aan-twee samen (zoals commando "paste" doet). sed '$!N;s/\n/ /' # als een regel eindigt met een backslash (\), voeg dan de volgende # regel er aan toe. sed -e :a -e '/\\$/N; s/\\\n//; ta' # als een regel begint met het gelijk-teken, voeg het dan toe aan de # voorgaande regel en vervang "=" door een spatie. sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' # voeg komma's toe aan getallen, vervangt "1234567" door "1,234,567". gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # andere seds # voeg komma's toe aan getallen met decimale punt en minteken (GNU sed). gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta' # voeg een lege regel in na iedere vijfde regel (na regel 5, 10, 15 ...) gsed '0~5G' # alleen GNU sed sed 'n;n;n;n;G;' # andere seds SELECTIEF PRINTEN VAN BEPAALDE REGELS: # print de eerste tien regels van een bestand (emuleert "head"). sed 10q # print de eerste regel van een bestand (emuleert "head -1"). sed q # print de laatste tien regels van een bestand (emuleert "tail"). sed -e :a -e '$q;N;11,$D;ba' # print de laatste twee regels van een bestand (emuleert "tail -2"). sed '$!N;$!D' # print de laatste regel van een bestand (emuleert "tail -1"). sed '$!d' # methode een sed -n '$p' # methode twee # print de op-een-na-laatste regel van een bestand. sed -e '$!{h;d;}' -e x # bij een-regelig bestand, print lege regel sed -e '1{$q;}' -e '$!{h;d;}' -e x # bij een-regelig bestand, print die regel sed -e '1{$d;}' -e '$!{h;d;}' -e x # bij een-regelig bestand, print niets # print enkel de regels die overeen komen met een reguliere expressie # (emuleert "grep") sed -n '/regexp/p' # methode een sed '/regexp/!d' # methode twee # print enkel de regels die NIET overeen komen met een reguliere expressie # (emuleert "grep -v") sed -n '/regexp/!p' # methode een, correspondeert met voorgaande sed '/regexp/d' # methode twee, eenvoudigere syntax # print de regel onmiddelijk voor een regexp, maar niet de regel # die de regexp bevat. sed -n '/regexp/{g;1!p;};h' # print de regel onmiddelijk na een regexp, maar niet de regel # die de regexp bevat. sed -n '/regexp/{n;p;}' # print een enkele regel voor en na regexp, met het regelnummer # waarop regexp voorkomt (identiek aan "grep -A1 -B1"). sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h # zoek naar regels die zowel AAA als BBB als CCC bevatten # (in willekeurige volgorde). sed '/AAA/!d; /BBB/!d; /CCC/!d' # zoek naar regels die zowel AAA als BBB als CCC bevatten # (in die volgorde). sed '/AAA.*BBB.*CCC/!d' # zoek naar regels die AAA of BBB of CCC bevatten (emuleert "egrep"). sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # meeste seds gsed '/AAA\|BBB\|CCC/!d' # alleen GNU sed # print een paragraaf als het AAA bevat # (paragrafen gescheiden door lege regels) # Bij gebruik van HHsed v1.5 moet in de volgende drie scripts # 'x;' worden gevolgd door 'G;'. sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' # print paragraaf als het AAA en BBB en CCC bevat # (in willekeurige volgorde). sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d' # print paragraaf als het AAA of BBB of CCC bevat. sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # alleen GNU sed # print alleen regels die 65 of meer karakters bevatten. sed -n '/^.\{65\}/p' # print alleen regels die minder dan 65 karakters bevatten. sed -n '/^.\{65\}/!p' # methode een, komt overeen met bovenstaande sed '/^.\{65\}/d' # methode twee, eenvoudigere syntax # print vanaf de regel waarop regex voorkomt tot einde bestand. sed -n '/regexp/,$p' # print deel van bestand gebaseerd op regelnummers (regel 8-12, inclusief). sed -n '8,12p' # methode een sed '8,12!d' # methode twee # print regel nummer 52. sed -n '52p' # methode een sed '52!d' # methode twee sed '52q;d' # methode drie, efficient met grote bestanden # beginnend bij regel drie, print iedere zevende regel. gsed -n '3~7p' # alleen GNU sed sed -n '3,${p;n;n;n;n;n;n;}' # andere seds # print deel van bestand tussen twee reguliere expressies (inclusief). sed -n '/Amsterdam/,/Rotterdam/p' # hoofdletter gevoelig SELECTIEVE VERWIJDERING VAN REGELS: # print alle regels behalve die tussen twee reguliere expressies. sed '/Amsterdam/,/Rotterdam/d' # verwijder dubbele en op elkaar volgende regels (emuleert "uniq"). # de eerste regel in een duplicaat set wordt behouden, de rest verwijderd. sed '$!N; /^\(.*\)\n\1$/!P; D' # verwijder dubbele, niet op elkaar volgende, regels. Pas op dat de # beschikbare ruimte in de bewaarbuffer (hold space) niet wordt # overschreden, gebruik anders GNU sed. sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' # verwijder alle regels behalve duplicaten (emuleert "uniq -d"). sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' # verwijder de eerste tien regels van een bestand. sed '1,10d' # verwijder de laatste regel van een bestand. sed '$d' # verwijder de laatste twee regels van een bestand. sed 'N;$!P;$!D;$d' # verwijder de laatste tien regels van een bestand. sed -e :a -e '$d;N;2,10ba' -e 'P;D' # methode een sed -n -e :a -e '1,10!{P;N;D;};N;ba' # methode twee # verwijder iedere achtste regel. gsed '0~8d' # alleen GNU sed sed 'n;n;n;n;n;n;n;d;' # andere seds # verwijder regels die overeen komen met zoekpatroon. sed '/patroon/d' # verwijder alle lege regels (gelijk aan "grep '.' ") sed '/^$/d' # methode een sed '/./!d' # methode twee # verwijder alle opeenvolgende lege regels behalve de eerste; verwijdert # tevens alle lege regels van begin en einde van het bestand. # (emuleert "cat -s") sed '/./,/^$/!d' # methode een, lege regel aan einde toegestaan sed '/^$/N;/\n$/D' # methode twee, lege regel aan begin toegestaan # verwijder alle opeenvolgende lege regels behalve de eerste twee. sed '/^$/N;/\n$/N;//D' # verwijder alle lege regels aan het begin van het bestand. sed '/./,$!d' # verwijder alle lege regels aan het einde van het bestand. sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # werkt op alle sed versies sed -e :a -e '/^\n*$/N;/\n$/ba' # idem, behalve gsed 3.02.* # verwijder de laatste regel van iedere paragraaf. sed -n '/^$/{p;h;};/./{x;/./p;}' SPECIALE TOEPASSINGEN: # verwijder nroff overslag (meervoudige afdruk van een karakter) uit # handleidingspagina's (man pages). Bij gebruik van Unix System V of de # bash shell moet de -e switch bij het echo commando gebruikt worden. sed "s/.`echo \\\b`//g" # dubbele aanhalingstekens verplicht in Unix sed 's/.^H//g' # bash/tcsh: druk op Ctrl-V en Ctrl-H sed 's/.\x08//g' # hex expressie voor sed 1.5, GNU sed, ssed # print Usenet/e-mail message header sed '/^$/q' # verwijdert alles na de eerste lege regel # print Usenet/e-mail message body sed '1,/^$/d' # verwijdert alles tot en met eerste lege regel # print Onderwerp-regel, maar verwijder "Onderwerp: " deel sed '/^Onderwerp: */!d; s///;q' # print retour adres sed '/^Reply-To:/q; /^From:/h; /./d;g;q' # selecteer het werkelijke adres. Haalt uit de uitvoer van het vorige # het e-mail adres. sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' # print een groter-dan teken en een spatie vooraan iedere regel # ("quote a message") sed 's/^/> /' # verwijder groter-dan teken en spatie vooraan iedere regel # ("unquote a message") sed 's/^> //' # verwijder het meerendeel van de HTML tags. Houdt rekenening met # tags verspreid over meerdere regels. sed -e :a -e 's/<[^>]*>//g;/zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat -----------------------------------------------------------------------------------