Bash Sed-voorbeelden

Bash Sed Examples



Met Bash kun je patroonvervanging uitvoeren met behulp van variabele uitbreiding zoals (${var/pattern/replacement}). En dus doet sed zo (sed -e 's/pattern/replacement/'). Er komt echter meer bij kijken dan het vervangen van patronen in tekstbestanden. Hier zullen we bijvoorbeeld sed herontdekken met gelijkwaardige commando's en workflows om te helpen bij dagelijkse taken.

Opstelling voor sed-voorbeelden

Hier is een korte handleiding om het voorbeeld in te stellen, die ik zal proberen niet te overdreven te maken.







woordenis een tekstbestand met de nummers 1 tot en met 100. Als u niet zeker weet welke opdracht u moet maken, raadpleeg dan de functie Export voor xargs in Bash Export Command . Je weet maar nooit dat het bij je volgende shellscripting-interview kan zijn.



baris een tekstbestand met een enkele regel —.



oud-phpis een tekstbestand met regels van oude PHP die in php7 of later zullen breken. (Hint: ereg)





Merk op dat alle hierboven beschreven functies hieronder te vinden zijn in Endnote on functions for setup.

Sed voorbeelden met gelijkwaardige commando's

In een opdrachtregelomgeving zult u merken dat er meer dan één oplossing is voor een bepaalde taak. Meestal wil je echter het pad volgen dat de minste weerstand oplevert. Hier is een lijst met voorbeelden van sed-commando's met overeenkomstige equivalente commando's, waarvan sommige hieronder in detail worden behandeld.



1. Druk een willekeurige regel af (gelijk aan sort -R – | head -1)

sed -N '$(( WILLEKEURIG % 100 ))P'-

2. Druk de laatste regel in het bestand af (gelijk aan kop -1 -)

sed -N '$p'-

3. Druk de eerste 10 regels in een bestand af (gelijk aan kop -n 10 -)

sed '10q'-

4. Druk de eerste regel in een bestand af (gelijk aan staart -1 -)

sed -N '1p'-

5. Verwijder alle instanties van een teken (equivalent aan tr -delete '0' -, waarbij 0 het teken is dat we willen verwijderen)

sed -En 's / 0 // g'-

6. Converteer csv-bestand naar tsv (gelijk aan tr ‘,’ ‘ ’ -)

sed -En 's/,/ /g'-

7. Voeg een regel toe aan het bestand (equivalent aan kattenbalk -)

sed '$ een ---'-

8. Voeg een regel toe aan het bestand (equivalent aan cat – bar)

sed '1i---'-

9. Print alle regels in bestand (gelijk aan cat -)

sed -N -En 'P'-

10. Druk een lijn af die overeenkomt met een patroon (gelijk aan grep -e '^1' -)

sed -N -En '/^1/p'-

11. Verwijder lijnen die overeenkomen met een patroon (equivalent aan grep -v -e '^1' -)

sed -En '/^1/d'-

12. Verkrijg het aantal regels in een bestand (gelijk aan wc -l -)

sed -N -En '$ ='-

13. Schrijf naar een bestand op de achtergrond (equivalent commando tee)

sed 'in$ {1}'-

Voorbeeld waarin sed wordt gebruikt om het tee-commando te implementeren

Rechtsboven is er een voorbeeld met de naam Schrijf naar een bestand op de achtergrond. Klinkt een beetje als het tee-commando. Wel het is. Hier zullen we ingaan op het implementeren van een functie om tee in bash te vervangen met behulp van sed.

Commando's

tee ()
{
toets $ {#} -eq 1 || opbrengst;
sed 'in$ {1}'-
}
hoofd()
teedit;
katdit

hoofd

Uitgang:

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Hier ziet u twee lijsten met de gehele getallen van 1 tot 10. De eerste is van het seq-commando. De tweede krijgen we van de kat van het bestand geschreven in tee. Ik weet dat het belachelijk is, maar het werkt!

Voorbeeld waarbij sed wordt gebruikt om een ​​willekeurige regel in een bestand af te drukken

Stel dat we een willekeurige regel in een bestand willen afdrukken met bash en een klein beetje sed. Kunnen we het doen? Ja dat kunnen we! Hier is hoe.

Implementeer een functie die

  1. Krijgt het aantal regels in een bestand, L
  2. Genereert een willekeurig getal tussen 1 en L, R
  3. Afdrukken R

De functie verwacht dat de invoer van buitenaf wordt doorgesluisd.

Commando's

een lijn()
{
functielc()
{
sed -N -En '$ ='-
};
functieprint-lijn()
{
sed -N -En '$ {1}P'-
};
temp= $( mktemp );
kat-> ${temp};
kat ${temp} |print-regel $((WILLEKEURIG%$( kat ${temp} |lc)+1 ));
rm ${temp}
}

Voorbeeld gebruik (1)

volgende 100 |_

Uitgang (1)

35

Voorbeeld gebruik (2)

krul https://linuxhint.com/bash_cut_command/ --stil |strip-tags|een lijn

Zie het onderstaande voorbeeld, waarbij sed wordt gebruikt om HTML-tags te verwijderen. Merk op dat het over-voorbeeld soms blanco retourneert voor lege regels. Als oefening kan het verbeterd worden.

Sed gebruiken om regels in een bestand af te drukken

Stel dat u een functie in bash wilt implementeren om een ​​bepaalde regel in een bestand af te drukken. Een enkele regel in een bestand proberen af ​​te drukken met een lus in bash, head, tail of awk is te veel werk om regels in een bestand af te drukken. Maar goed dat we hebben geslapen. De resulterende functie die sed gebruikt, zou als volgt zijn.

Commando's

print-lijn()
{
sed -N '$ {1}P'-
}

Laten we nu eens kijken wat er gebeurt als we print-line op woorden gebruiken.

Commando's

woorden|print-lijnvijftig

Uitgang:

vijftig

Oke. Ziet er goed uit, maar laten we iets proberen dat er iets minder triviaal uitziet.

Commando's

verklaren -xfwoorden
verklaren -xfprint-lijn
volgende 1 10$(woorden| wc -de ) | xargs-lbash -C 'woorden | printregel {}'

Uitgang:

1
elf
eenentwintig
31
41
51
61
71
81
91

Oke. Nou dat lijkt er meer op! Je ziet hoe sed in een bash-script kan worden gebruikt om elke regel in een bestand af te drukken.

Sed-voorbeelden zonder equivalente opdrachten

In een opdrachtregelomgeving is de weg naar een oplossing die de minste weerstand oplevert soms de sed-manier; anders doe je uiteindelijk meer werk dan in de eerste plaats nodig was. Sommige commando's kunnen hieronder worden weergegeven.

Commando alle regels in een shellscript

sed -En 's/^/#/'-
Eerste regel verwijderen
sed -En '1d'-
Verwijderenlaatstelijn
sed -En '$ d'-
Een lijn invoegen vóór lijnen die overeenkomen met een patroon
sed '/0$/i ---'-
Voeg een regel in na regels die overeenkomen met een patroon
sed '/ 0 $ / ---'-
Verwijder html-tags
sed -En 's /†*.// g'-
Upgrade ereginoude php-code om uit te voereninphp7 of hoger
sed 's/ereg(([^,]*).([^)]*)./strpos(2,1)/g'
Rekeningindien sedis eerder dan een bepaalde versie
sed -En 'v 4.5'-

Voorbeeld sed-versie vertakking in bash

Boven in de voorbeelden is er een regel om te controleren of sed eerder is dan een bepaalde versie die we kunnen gebruiken om versievertakking in bash te implementeren, wat volgens mij gemakkelijker is dan proberen een functie te implementeren om versienummers van sed -versie-uitvoer te vergelijken . Die enige valkuil is dat als er een eerdere versie van sed is die het v-commando niet ondersteunt, we in de problemen zitten.

Commando's

test-sed-versie-maximaal() {
gooide uit -N | sed 'v$ {1}'-2> /dev/nul
}
probeer-versie()
{
gooide uit -N 'Versie$ {1}. Oke. Doe het de ';
test-sed-versie-maximaal$ {1} && {
gooide uit -N 'oud';
waar
} || {
gooide uit -N 'nieuwe'
};
gooide uit ' manier.'
}
hoofd()
{
lokaalv;
voorvin 4.{4,5};
doen
probeer-versie$ {v};
gedaan
}
hoofd

Uitgang:

Versie4.4. Oke. Doe het op de oude manier.
Versie4.5. Oke. Doe het op de nieuwe manier.

Merk op dat de versie van sed die op mijn machine draait vanaf het typen van deze tekens 4.4 is, wat de bovenstaande uitvoer zou verklaren. Tegelijkertijd was de nieuwste versie van gnu sed 4.7, ongeveer 3 jaar ouder dan degene die ik heb. Mijn sed is oud! In sed 4.0.6 is zelfs een parameter toegevoegd aan het versiecommando, dus deze strategie werkt voor alle genoemde v4.0.6, wat soepel is als je bedenkt dat de versie begin 2003 werd uitgebracht. Je zit goed.

Ik heb wat extra gegraven, eigenlijk NIEUWS dat de laatste broncode voorleest. Versie 4.6 heeft een nieuwe functie, -debug die het script dumpt en uitvoerregels annoteert. Dit zou je in staat stellen om sed-scripts die zijn gegenereerd door functies in bash naar canonieke vorm te vertalen. Koel! Vergeet alleen niet dat je een sed-versie nodig hebt die vertakt in bash. Dat is waar dit sed-voorbeeld in het spel komt.

Voorbeeld bash-functie die sed gebruikt om HTML-tags te verwijderen

In de bovenstaande voorbeelden is er een regel om HTML-tags te verwijderen. Laten we dat in een bash-functie gooien en deze gebruiken om alle HTML-tags uit het laatste artikel dat ik schreef te verwijderen.

Commando's

strip-tags()
{
sed -En 's /†*.// g'-
}
krul https://linuxhint.com/bash_cut_command/ --stil |strip-tags

Ik kan niet zeggen dat het perfect is, maar het is in ieder geval leesbaar in de terminal.

Sed-voorbeelden met workflows: Voorbeeldworkflow: vervang alles veilig met find, grep en sed

Het is veilig om te zeggen dat wijzigingen die zijn aangebracht met sed met de optie -i onomkeerbaar zijn. Tenzij u helemaal zeker weet welke tekst moet worden vervangen, krijgt u waarschijnlijk één teken minder dan bedoeld. Daarom gebruiken we in dit voorbeeld sed in een workflow om veilig tekst te vervangen in alle bestanden die je hebt geselecteerd.

Werkstroom

  1. vind
  2. greep
  3. sed
vind

Hier selecteert u de bestanden die moeten worden vervangen. Ik raad aan om een ​​​​commando in de volgende zin te gebruiken:

vind -typeF-naam | greep -v-En| xargs-l ...

U wilt bijvoorbeeld als volgt de bestanden beperken om PHP-bestanden te vervangen, met uitzondering van git-repository-directory's.

vind -typeF-naam*.php| greep -v -En '.Gaan' | xargs -l...

Lees meer over het xargs-commando in bash.

greep

Vervolgens gaan we proberen een patroon te matchen in de bestanden die als volgt zijn geselecteerd. Merk op dat aangezien we de -o optie voor grep gebruiken, de uitvoer alleen een overeenkomende string zal tonen als die er is.

vind -typeF-naam*.php| greep -v -En '.Gaan' |
xargs -l greep -Eneen patroon-of

De bovenstaande opdracht zou een lijst met tekenreeksen moeten retourneren die overeenkomen met een patroon.

sed

Ten slotte willen we alle strings vervangen die overeenkomen met some_pattern. Om dat te doen, moeten we grep als volgt naar sed converteren.

vind -typeF-naam*.php| greep -v -En '.Gaan' |
xargs -l sed -l -Ens/een patroon/vervanging/G

Het grep-commando wordt sed -i en de optie -o wordt verwijderd. En daar heb je het.

Nu kunt u vooraf controleren welke snaren in sed worden vervangen in plaats van uw geluk te testen.

Eindnoten bij opties die in voorbeelden worden gebruikt

Hier is een lijst met opties die in de kort besproken sed-voorbeelden worden gebruikt.

Optie Beschrijving
-l Bewerken op zijn plaats. Als de invoer een bestand is (niet doorgesluisd), zal het resultaat van expressies de inhoud van het bestand overschrijven.

Sed accepteert er een

bv) sed -n …

-En -e staat voor expressie. De parameter is een uitdrukking in de sed-taal.

Sed accepteert veel

bv) sed -e'expr1' -e'expr2'

-N Verbergt regel die niet wordt beïnvloed door de uitdrukking. Dat wil zeggen, als de expressie een print-instructie in de sed-taal is, worden regels die niet in de print-instructie zijn opgenomen, niet in de uitvoer opgenomen.

bv) sed -n …

Voor meer informatie over de beschikbare sed-opties, zie sed –help

Eindnoten bij equivalente commando's die in voorbeelden worden gebruikt

De volgende opdrachtregelhulpprogramma's zijn opgenomen in de sed-voorbeelden met equivalente opdrachten.

  • soort
  • hoofd
  • staart
  • greep
  • kat
  • NS
  • tee

Eindnoot op de trailing - in voorbeeld equivalente commando's

Als je je afvraagt ​​wat er aan de hand is met het – teken in het voorbeeld, dan is deze notitie voor jou. Ik heb een – teken toegevoegd na de meeste commando's in de voorbeelden om aan te geven dat we verwachten dat de invoer via een pijp wordt ontvangen. Dat is,

kateen-bestand| soort -R-| hoofd -1

Wanneer echter het commando aan de linkerkant de pijp aanwezig is, kunnen we de hint als volgt weglaten.

kateen-bestand| soort -R | hoofd -1

Dat is wat er aan de hand was met het teken - na commando's in de voorbeelden.

Eindnoten over functies voor installatie

Voor het geval u zoekt, hier zijn functies voor de instellingen voor de bovenstaande voorbeelden. De uitvoer verkregen met declare -f. Lees meer over het declare-commando in bash voor meer gebruik.

Commando's

woorden()
{
volgende 100
}
bar()
{
gooide uit ---
}
oud-php()
{
gooide uit 'ereg ($ UA,' Bottybot ')'
}

Waar het op neerkomt:

Ik heb genoten van het schrijven van Bash sed-voorbeelden en heb onderweg zelfs een paar extra trucs opgepikt. Sed is een krachtig opdrachtregelprogramma en expressieve taal voor het manipuleren van tekstbestanden. Als je het leuk vond om over sed te leren, maak je geen zorgen, er is nog veel meer om aan te raken. Sed maar.