sed

Bash Sed-voorbeelden

Bash Sed-voorbeelden
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 overkill te maken.

"woorden" is een tekstbestand met de nummers 1 tot en met 100. Als u niet zeker bent van de opdracht om deze aan te maken, zie Exportfunctie voor xargs in Bash Export Commando. Je weet maar nooit dat het in je volgende shellscripting-interview kan zijn.

"bar" is een tekstbestand met een enkele regel -.

"old-php" is 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. Maar voor het grootste deel wil je 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 "$(( RANDOM % 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 (gelijk aan tr -delete '0' -, waarbij 0 het teken is dat we willen verwijderen)

sed -e 's/0//g' -

6. Converteer csv-bestand naar tsv (gelijk aan tr ',"\t' -)

sed -e 's/,/\t/g' -

7.Voeg regel toe aan bestand (gelijk aan kattenbalk -)

sed '$a ---' -

8. Voeg regel toe aan bestand (gelijk aan cat - bar)

sed '1i ---' -

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

sed -n -e 'p' -

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

sed -n -e '/^1/p' -

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

sed -e '/^1/d' -

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

sed -n -e '$=' -

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

sed "w $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 ()

test $# -eq 1 || terugkeer;
sed "w $1" -

hoofd ()

volgende 10 | tee tien;
kat tien

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 van 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 ()

functie lc ()

sed -n -e '$=' -
;
functie printregel ()

sed -n -e "$1p" -
;
temp=$(mktemp);
kat - > $temp;
kat $temp | print-line $(( RANDOM % $( cat $temp | lc ) + 1 ));
rm $temp

Voorbeeld gebruik (1)

volgende 100 | _

Uitgang (1)

35

Voorbeeld gebruik (2)

krul https://linuxhint.com/bash_cut_command/ --silent | 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 worden verbeterd.

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. Gelukkig hebben we sed. De resulterende functie die sed gebruikt, zou als volgt zijn:.

Commando's

printlijn ()

sed -n "$1p" -

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

Commando's

woorden | printlijn 50

Uitgang:

50

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

Commando's

declareren -xf woorden
declareren -xf print-line
volgende 1 10 $( woorden | wc -l ) | xargs -i bash -c "woorden | print-line "

Uitgang:

1
11
21
31
41
51
61
71
81
91

Oke. Nu lijkt het er meer op! Je ziet hoe sed kan worden gebruikt in een bash-script 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 -e 's/^/#/' -
Eerste regel verwijderen
sed -e '1d' -
Laatste regel verwijderen
sed -e '$ 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 -e 's/<[^>]*.//g' -
Upgrade ereg in oude php-code om te draaien in php7 of hoger
sed 's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Controleer of sed eerder is dan een bepaalde versie
sed -e '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-at-most()
echo -n | sed "v $1" - 2>/dev/null

probeer-versie ()

echo -n "Versie $1. Oke. Doe het de ";
test-sed-versie-maximaal $1 &&
echo -n "oud";
waar
||
echo -n "nieuw"
;
echo " weg."

hoofd ()

lokaal v;
voor v in 4.4,5;
Doen
probeer-versie $v;
gedaan

hoofd

Uitgang:

Versie 4.4. Oke. Doe het op de oude manier.
Versie 4.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 . is.4, 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 feite, in sed 4.0.6, er is een parameter toegevoegd aan het versiecommando, dus deze strategie werkt voor elke genoemde v4.0.6, wat soepel is gezien de versie die begin 2003 werd uitgebracht. Jij bent 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 gegenereerd door functies in bash te vertalen naar canonieke vorm. Stoer! 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 het gebruiken om alle HTML-tags uit het laatste artikel dat ik schreef te verwijderen.

Commando's

striptags ()

sed -e 's/<[^>]*.//g' -

krul https://linuxhint.com/bash_cut_command/ --silent | 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 je helemaal zeker weet welke tekst moet worden vervangen, heb je 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. grep
  3. sed
vind

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

zoek -type f -naam | grep -v -e | xargs -i …

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

zoek -type f -naam \*.php | grep -v -e '.git' | xargs-ik…

Lees meer over het xargs-commando in bash.

grep

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.

zoek -type f -naam \*.php | grep -v -e '.git' |
xargs -i grep -e some_pattern -o

De bovenstaande opdracht zou een lijst met strings moeten retourneren die overeenkomen met some_pattern.

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:.

zoek -type f -naam \*.php | grep -v -e '.git' |
xargs -i sed -i -e s/some_pattern/replacement/g

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

Nu kun je vooraf controleren welke snaren in sed worden vervangen in plaats van je geluk te testen.

Eindnoten bij opties die in voorbeelden worden gebruikt

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

Keuze Omschrijving
-ik Ter plekke bewerken. 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…

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

Sed accepteert veel

bv) sed -e 'uitdr1' -e 'uitdr2'..

-nee 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 opgenomen in de uitvoer.

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:.

Eindnoot op de trailing - in voorbeeld equivalente commando's

Voor het geval je je afvraagt ​​wat er aan de hand is met het - teken in het voorbeeld, deze notitie is 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,

kat een bestand | sorteer -R - | hoofd -1

Echter, wanneer het commando aan de linkerkant de pijp aanwezig is, kunnen we de hint als volgt weglaten:.

kat een bestand | sorteer -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 ()

echo ---

oud-php ()

echo '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 op.

Beste Linux-distributies voor gaming in 2021
Het Linux-besturingssysteem heeft een lange weg afgelegd van zijn oorspronkelijke, eenvoudige, servergebaseerde uiterlijk. Dit besturingssysteem is de...
Hoe u uw gamesessie op Linux kunt vastleggen en streamen
In het verleden werd het spelen van games alleen als een hobby beschouwd, maar met de tijd zag de game-industrie een enorme groei in termen van techno...
Beste spellen om te spelen met handtracking
Oculus Quest introduceerde onlangs het geweldige idee van handtracking zonder controllers. Met een steeds toenemend aantal games en activiteiten die f...