Bash Sed Eksempler

Bash Sed Examples



Bash lar deg utføre mønsterbytte ved hjelp av variabel ekspansjon som ($ {var/pattern/replacement}). Og så liker sed dette (sed -e ‘s/pattern/replacement/’). Det er imidlertid mer å si enn å erstatte mønstre i tekstfiler. Her vil vi gjenoppdage sed, med eksempel, med tilsvarende kommandoer og arbeidsflyter for å hjelpe i daglige oppgaver.

Oppsett for sed eksempler

Her er en rask guide for å sette deg opp for eksemplet, som jeg vil prøve å ikke gjøre for overkill.







order en tekstfil som inneholder tallene 1 til 100. Hvis du er usikker på kommandoen for å lage den, kan du se Eksportfunksjon for xargs i Bash Export Command. Du vet aldri at det kan være på ditt neste shell -skriptintervju.



barer en tekstfil som inneholder en enkelt linje -.



gammel-phper en tekstfil som inneholder linjer med gammel PHP som vil bryte i php7 eller senere. (Hint: ereg)





Vær oppmerksom på at alle funksjonene beskrevet ovenfor finner du nedenfor i Endnote om funksjoner for oppsett.

Sed eksempler med tilsvarende kommandoer

I et kommandolinjemiljø finner du at det er mer enn én løsning på en gitt oppgave. For det meste vil du imidlertid gå med stien som gir minst motstand. Her er en liste over eksempler på sed -kommandoer med tilsvarende ekvivalente kommandoer, hvor noen vil bli beskrevet i detalj nedenfor.



1. Skriv ut en tilfeldig linje (tilsvarer sortering -R -| hode -1)

sed -n '$ ((RANDOM % 100)) p '-

2. Skriv ut den siste linjen i filen (tilsvarer hode -1 -)

sed -n '$ p'-

3. Skriv ut de første 10 linjene i en fil (tilsvarer head -n 10 -)

sed '10q'-

4. Skriv ut den første linjen i en fil (tilsvarer hale -1 -)

sed -n '1p'-

5. Slett alle forekomster av et tegn (tilsvarer tr –delete ‘0’ -, hvor 0 er tegnet vi vil slette)

sed -Og 's / 0 // g'-

6. Konverter csv -fil til tsv (tilsvarer tr ‘,’ ‘ t’ -)

sed -Og 's/,/ t/g'-

7. Legg linje til fil (tilsvarer kattefelt -)

sed '$ a ---'-

8. Forbered linjen til filen (tilsvarer cat -bar)

sed '1i ---'-

9. Skriv ut alle linjene i filen (tilsvarer cat -)

sed -n -Og 'p'-

10. Skriv ut linjer som matcher et mønster (tilsvarer grep -e ‘^1’ -)

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

11. Slett linjer som samsvarer med et mønster (tilsvarer grep -v -e ‘^1’ -)

sed -Og '/^1/ d'-

12. Få antall linjer i en fil (tilsvarer wc -l -)

sed -n -Og '$ ='-

13. Skriv til en fil i bakgrunnen (tilsvarende kommando tee)

sed 'i$ {1}'-

Eksempel på bruk av sed for å implementere tee -kommandoen

Rett over er det et eksempel merket Skriv til en fil i bakgrunnen. Høres litt ut som tee -kommandoen. Vel, det er det. Her vil vi utvide hvordan du implementerer en funksjon for å erstatte tee i bash ved å bruke sed.

Kommandoer

tee ()
{
test $ {#} -ekv 1 || komme tilbake;
sed 'i$ {1}'-
}
hoved-()
teedette;
kattdette

hoved-

Produksjon

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

Her vil du se to oppføringer av heltallene fra 1 til 10. Den første er fra seq -kommandoen. Den andre får vi fra katten i filen skrevet i tee. Jeg vet at det er latterlig, men det fungerer!

Eksempel på bruk av sed for å skrive ut en tilfeldig linje i en fil

Anta at vi vil skrive ut en tilfeldig linje i en fil ved hjelp av bash og litt sed. Kan vi gjøre det? Ja vi kan! Dette er hvordan.

Implementere en funksjon som

  1. Får antall linjer i en fil, L
  2. Genererer et tilfeldig tall mellom 1 og L, R
  3. Skriver ut R

Funksjonen forventer at inngangen sendes fra utsiden.

Kommandoer

noen-linje()
{
funksjonlc()
{
sed -n -Og '$ ='-
};
funksjonprint-line()
{
sed -n -Og '$ {1}p '-
};
temp= $( mktemp );
katt-> $ {temp};
katt $ {temp} |print-line $((TILFELDIG%$( katt $ {temp} |lc)+1 ));
rm $ {temp}
}

Eksempel på bruk (1)

seq 100 |_

Utgang (1)

35

Eksempel på bruk (2)

krølle https://linuxhint.com/bash_cut_command/ --stille |strip-tags|noen-linje

Se eksemplet nedenfor ved å bruke sed for å fjerne HTML -tagger. Vær oppmerksom på at overeksemplet noen ganger returnerer tomt for tomme linjer. Som en øvelse kan den forbedres.

Bruk sed til å skrive ut linjer i en fil

Anta at du vil implementere en funksjon i bash for å skrive ut en gitt linje i en fil. Å prøve å skrive ut en enkelt linje i en fil med en sløyfe i bash, hode, hale eller awk er for mye arbeid for å skrive ut linjer i en fil. Godt vi har sed. Den resulterende funksjonen ved bruk av sed vil være som følger.

Kommandoer

print-line()
{
sed -n '$ {1}p '-
}

La oss nå se hva som skjer når vi bruker utskriftslinje på ord.

Kommandoer

ord|print-linefemti

Produksjon

femti

Greit. Ser bra ut, men la oss prøve noe som ser litt mindre trivielt ut.

Kommandoer

erklære -xford
erklære -xfprint-line
seq 1 10$(ord| toalett -de ) | xargs-Jegbash -c 'ord | print-line {} '

Produksjon

1
elleve
tjueen
31
41
51
61
71
81
91

Greit. Nå er det mer som det! Du ser hvordan sed kan brukes i et bash -skript for å skrive ut hvilken som helst linje i en fil.

Sed eksempler uten tilsvarende kommandoer

I et kommandolinjemiljø er noen ganger veien til en løsning som gir minst motstand den sedvegen; ellers ender du med å gjøre mer arbeid enn nødvendig i utgangspunktet. Noen kommandoer kan vises nedenfor.

Kommander alle linjene i et skallskript

sed -Og 's/^/#/'-
Slett første linje
sed -Og '1d'-
Slettsistelinje
sed -Og '$ d'-
Sett inn en linje før linjer som matcher et mønster
sed '/0 $/i ---'-
Sett inn en linje etter linjer som matcher et mønster
sed ' / 0 $ / ---'-
Fjern html -tagger
sed -Og 's /†*.// g'-
Oppgrader eregigammel php -kode som skal kjøresiphp7 eller nyere
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Kryss avhvis seder tidligere enn en bestemt versjon
sed -Og 'v 4.5'-

Eksempel sed versjon forgrening i bash

Ovenfor i eksemplene er det en linje for å sjekke om sed er tidligere enn en bestemt versjon som vi kan bruke til å implementere versjonsgrening i bash, som jeg tror er enklere enn å prøve å implementere en funksjon for å sammenligne versjonsnumre fra sed –versjonsutgang . Den eneste fallgruven er at hvis det er en tidligere versjon av sed som ikke støtter v -kommandoen, er vi i trøbbel.

Kommandoer

test-sed-versjon-på-det meste() {
kastet ut -n | sed 'v$ {1}'-2> /dev/null
}
prøveversjon()
{
kastet ut -n 'Versjon$ {1}. Greit. Gjør det ';
test-sed-versjon-på-det meste$ {1} && {
kastet ut -n 'gammel';
ekte
} || {
kastet ut -n 'ny'
};
kastet ut 'måte.'
}
hoved-()
{
lokalv;
tilvi 4.{4,5};
gjøre
prøveversjon$ {v};
gjort
}
hoved-

Produksjon

Versjon4.4. Greit. Gjør det på den gamle måten.
Versjon4.5. Greit. Gjør det på den nye måten.

Vær oppmerksom på at versjonen av sed som kjører på min maskin ved å skrive disse tegnene er 4.4, noe som vil forklare utdataene ovenfor. Samtidig var den siste versjonen av gnu sed 4.7, omtrent 3 år eldre enn den jeg har. Min sed er gammel! Faktisk, i sed 4.0.6, ble det lagt til en parameter i versjonskommandoen, så denne strategien fungerer for alle nevnte minst v4.0.6, noe som er mildt med tanke på at versjonen ble utgitt i begynnelsen av 2003. Du er flink.

Jeg gravde litt ekstra, faktisk NEWS ved å lese ut den siste kildekoden. Versjon 4.6 har en ny funksjon, –debug som dumper skriptet og kommenterer utgangslinjer. Dette vil tillate deg å oversette sed skript generert av funksjoner i bash til kanonisk form. Kul! Bare ikke glem at du trenger sed versjon forgrening i bash. Det er her dette sed eksemplet spiller inn.

Eksempel på bash -funksjon ved å bruke sed for å fjerne HTML -koder

I eksemplene ovenfor er det en linje for å fjerne HTML -koder. La oss kaste det inn i en bash -funksjon og bruke den til å fjerne alle HTML -taggene fra den siste artikkelen jeg skrev.

Kommandoer

strip-tags()
{
sed -Og 's /†*.// g'-
}
krølle https://linuxhint.com/bash_cut_command/ --stille |strip-tags

Jeg kan ikke si at det er perfekt, men det er i det minste lesbart i terminalen.

Sed eksempler med arbeidsflyter: Eksempel på arbeidsflyt: erstatt alle på en sikker måte ved hjelp av finn, grep og sed

Det er trygt å si at endringer som er gjort med sed med -i -alternativet er irreversible. Det er med mindre du er helt sikker på hvilken tekst som skal erstattes, vil du sannsynligvis ende opp med et tegn mindre enn det som er tiltenkt. Derfor vil vi i dette eksemplet bruke sed i en arbeidsflyt for å trygt erstatte tekst i alle filene du har valgt.

Arbeidsflyt

  1. finne
  2. grep
  3. sed
finne

Her vil du velge filene som skal erstattes. Jeg foreslår at du bruker en kommando langs disse linjene:

finne -typef-Navn | grep -v-Og| xargs-Jeg ...

For eksempel kan det være lurt å begrense filene til å erstatte PHP -filer unntatt git repository -kataloger som følger.

finne -typef-Navn*.php| grep -v -Og '.gå' | xargs -Jeg...

Les mer om xargs -kommandoen i bash.

grep

Deretter skal vi prøve å matche some_pattern i filene som er valgt som følger. Vær oppmerksom på at siden vi bruker alternativet -o for grep, vil utgangen bare vise matchet streng hvis noen.

finne -typef-Navn*.php| grep -v -Og '.gå' |
xargs -Jeg grep -Ognoe_mønster-eller

Kommandoen ovenfor skal returnere en liste over strenger som matcher some_pattern.

sed

Til slutt vil vi erstatte alle strengene som matcher some_pattern. For å gjøre det må vi konvertere grep til sed som følger.

finne -typef-Navn*.php| grep -v -Og '.gå' |
xargs -Jeg sed -Jeg -Ogs/noe_mønster/erstatning/g

Grep -kommandoen blir sed -i og alternativet -o fjernes. Og der har du det.

Nå kan du sjekke hvilke strenger som skal byttes ut i sed på forhånd i stedet for å teste lykken.

Sluttnoter om alternativer som brukes i eksempler

Her er en liste over alternativer som brukes i sed eksemplene som ble diskutert kort.

Alternativ Beskrivelse
-Jeg Rediger på plass. Hvis inndata er en fil (ikke pipet inn) vil resultatet av uttrykk overskrive innholdet i filen.

Sed godtar en

f.eks) sed -n ...

-Og -e står for uttrykk. Parameteren er et uttrykk på sed -språket.

Sed tar imot mange

f.eks) sed -e'expr1 '-e'expr2'

-n Skjuler linje som ikke påvirkes av uttrykket. Det vil si at uttrykket er en utskriftssetning på sed -språket, så vil linjer som ikke er inkludert i utskriftssetningen ikke inkluderes i utskriften.

f.eks) sed -n ...

For mer om tilgjengelige alternativer, se sed –help

Sluttnotater om tilsvarende kommandoer brukes i eksempler

Følgende kommandolinjeverktøy er inkludert i sed-eksemplene med tilsvarende kommandoer.

  • sortere
  • hode
  • hale
  • grep
  • katt
  • NS
  • tee

Sluttnote om den etterfølgende - i eksempel tilsvarende kommandoer

Hvis du lurer på hva som skjer med - -tegnet i eksemplet, er dette notatet noe for deg. Jeg la til et - tegn etter de fleste kommandoene i eksemplene for å antyde at vi forventer at input blir mottatt gjennom et rør. Det er,

kattnoen filer| sortere -R-| hode -1

Men når kommandoen på venstre side av røret er tilstede, kan vi utelate hintet som følger.

kattnoen filer| sortere -R | hode -1

Det var det som foregikk med - tegnet etter kommandoer i eksemplene.

Sluttnoter om funksjoner for oppsett

Hvis du leter, er det funksjoner for oppsettet for eksemplene ovenfor. Utgangen oppnådd ved hjelp av deklarere -f. Les mer om kommandoen deklar i bash for flere bruksområder.

Kommandoer

ord()
{
seq 100
}
bar()
{
kastet ut ---
}
gammel-php()
{
kastet ut 'ereg ($ UA,' Bottybot ')'
}

Bunnlinjen

Jeg likte å skrive Bash sed -eksempler og tok til og med noen ekstra triks underveis. Sed er et kraftig kommandolinjeverktøy og uttrykksfullt språk for å manipulere tekstfiler. Hvis du likte å lære om sed, ikke bekymre deg, det er fortsatt mye mer som skal berøres. Sed på.