sed

Eksempler på Bash Sed

Eksempler på Bash Sed
Bash lar deg utføre mønsterutskifting ved hjelp av variabel utvidelse som ($ var / mønster / erstatning). Og så, gjør sed slik (sed-e 's / mønster / erstatning /'). Det er imidlertid mer å sed enn å erstatte mønstre i tekstfiler.  Her vil vi gjenoppdage sed, med eksempel, med tilsvarende kommandoer og arbeidsflyter for å hjelpe til med daglige oppgaver.

Oppsett for sed eksempler

Her er en rask guide for å få satt opp eksemplet, som jeg vil prøve å ikke gjøre for mye.

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

“Bar” er en tekstfil som inneholder en enkelt linje -.

“Old-php” er en tekstfil som inneholder linjer med gammel PHP som vil brytes i php7 eller senere. (Hint: ereg)

Merk at alle funksjonene som er beskrevet ovenfor, finner du nedenfor i Endnote om funksjoner for oppsett.

Sed eksempler med tilsvarende kommandoer

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

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

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

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

sed -n '$ p' -

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

sed '10q' -

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

sed -n '1p' -

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

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

6. Konverter csv-fil til tsv (tilsvarer tr ', "\ t' -)

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

7.Legg til linje til fil (tilsvarer kattelinje -)

sed '$ a ---' -

8. Forhåndslinje til fil (tilsvarer cat-bar)

sed '1i ---' -

9. Skriv ut alle linjer i filen (tilsvarer katt -)

sed -n -e 'p' -

10. Skriv ut linjer som samsvarer med et mønster (tilsvarer grep -e '^ 1' -)

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

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

sed -e '/ ^ 1 / d' -

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

sed -n -e '$ =' -

1. 3. Skriv til en fil i bakgrunnen (tilsvarende kommandotee)

sed "w $ 1" -

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

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

Kommandoer

tee ()

test $ # -eq 1 || komme tilbake;
sed "w $ 1" -

hoved ()

seq 10 | tee ti;
katt ti

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 lister over heltallene fra 1 til 10. Den første er fra seq-kommandoen. Det andre vi får fra katten til 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 skal røres fra utsiden.

Kommandoer

noen-linje ()

funksjon lc ()

sed -n -e '$ =' -
;
funksjon utskriftslinje ()

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

Eksempel på bruk (1)

seq 100 | _

Utgang (1)

35

Eksempel på bruk (2)

krølle https: // linuxhint.no / bash_cut_command / --silent | strip-tags | noen-linje

Se eksemplet nedenfor ved å bruke sed for å strippe HTML-koder. Merk at overeksemplet noen ganger returnerer tomt for tomme linjer. Som en øvelse kan den forbedres.

Bruke 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 ved hjelp av en sløyfe i bash, hode, hale eller awk er for mye arbeid for å skrive ut linjer i en fil. Bra at 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 | utskrift 50

Produksjon

50

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

Kommandoer

erklære -xf ord
erklære -xf utskriftslinje
seq 1 10 $ (ord | wc -l) | xargs -i bash -c "ord | utskriftslinje "

Produksjon

1
11
21
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 sedte måten; ellers ender du opp med å gjøre mer arbeid enn nødvendig. Noen kommandoer kan vises nedenfor.

Kommandere alle linjene i et skallskript

sed -e 's / ^ / # /' -
Slett første linje
sed -e '1d' -
Slett siste linje
sed -e '$ d' -
Sett inn en linje før linjer som samsvarer med et mønster
sed '/ 0 $ / i ---' -
Sett inn en linje etter linjer som samsvarer med et mønster
sed '/ 0 $ / ---' -
Fjern html-koder
sed -e's /<[^>] *.// g ' -
Oppgrader ereg i gammel php-kode for å kjøre i php7 eller senere
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Sjekk om sed er tidligere enn en bestemt versjon
sed -e 'v 4.5 ' -

Eksempel på 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 versjonsforgrening i bash, noe jeg mener 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, så er vi i trøbbel.

Kommandoer

test-sed-version-at-most ()
ekko -n | sed "v $ 1" - 2> / dev / null

prøveversjon ()

ekko -n "Versjon $ 1. Greit. Gjør det ";
test-sed-version-at-most $ 1 &&
ekko -n "gammel";
ekte
||
ekko -n "ny"
;
ekko "måte."

hoved ()

lokal v;
for v i 4.4,5;
gjøre
prøveversjon $ v;
ferdig

hoved-

Produksjon

Versjon 4.4. Greit. Gjør det på den gamle måten.
Versjon 4.5. Greit. Gjør det på den nye måten.

Merk at versjonen av sed som kjører på maskinen min når jeg skriver disse tegnene, er 4.4, som vil forklare resultatet ovenfor. Samtidig var den siste versjonen av GNU Sed 4.7, omtrent 3 år eldre enn den jeg har. Sedet mitt er gammelt! Faktisk i sed 4.0.6, ble det lagt til en parameter i versjonskommandoen, slik at denne strategien fungerer for alle nevnte minst v4.0.6, som er mild med tanke på at versjonen ble utgitt tidlig i 2003. Du er god.

Jeg gjorde litt ekstra graving, faktisk NYHETER å lese opp den siste kildekoden. Versjon 4.6 har en ny funksjon, -debug som dumper skriptet og kommenterer utgangslinjene. Dette vil tillate deg å oversette sed-skript generert av funksjoner i bash til kanonisk form. Kul! Bare ikke glem at du trenger forgrenet sed-versjon i bash. Det er her dette sed-eksemplet spiller inn.

Eksempel på bash-funksjon ved bruk av sed for å strippe HTML-koder

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

Kommandoer

strip-tags ()

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

krølle https: // linuxhint.no / bash_cut_command / --silent | strip-tags

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

Sed eksempler med arbeidsflyter: Eksempel arbeidsflyt: erstatt trygt alle ved hjelp av find, grep og sed

Det er trygt å si at endringer som er gjort med sed med alternativet -i, er irreversible. Det er med mindre du er helt sikker på hvilken tekst som skal erstattes, det er sannsynlig at du ender opp med ett tegn mindre enn beregnet. Det er grunnen til at vi i dette eksemplet bruker sed i en arbeidsflyt for å trygt erstatte tekst i alle filene du har valgt.

Arbeidsflyt

  1. finne
  2. grep
  3. sed
finne

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

finn -type f -navn | grep -v -e | xargs -i ..

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

finn -type f -navn \ *.php | grep -v -e '.git '| xargs -i ..

Les mer om xargs-kommandoen i bash.

grep

Deretter skal vi prøve å matche some_pattern i filene valgt som følger. Merk at siden vi bruker -o-alternativet for grep, vil utdataene bare vise matchet streng hvis noen.

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

Kommandoen ovenfor skal returnere en liste med streng som samsvarer med some_pattern.

sed

Til slutt vil vi erstatte all streng som samsvarer med noe_mønster. For å gjøre det må vi konvertere grep til sed som følger.

finn -type f -navn \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / some_pattern / erstatning / g

Grep-kommandoen blir sed -i og -o-alternativet 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.

Sluttnotater om alternativer brukt i eksempler

Her er en liste over alternativer som brukes i sedeksemplene som er 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 ..

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

Sed godtar mange

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

-n Skjuler linjen som ikke påvirkes av uttrykket. Det vil si hvis uttrykket er et utskriftsuttalelse på sed-språket, vil ikke linjer som ikke er inkludert i utskriftsuttalelsen, være inkludert i utdataene.

f.eks) sed -n ..

For mer informasjon 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.

Sluttnote om etterfølgende - i eksempel ekvivalente kommandoer

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

katt noen-fil | sorter -R - | hodet -1

Når kommandoen på venstre side av røret er til stede, kan vi imidlertid utelate hintet som følger.

katt noen-fil | sorter -R | hodet -1

Det var det som skjedde med kommandoer i karakteren etter eksemplene.

Sluttnotater om funksjoner for oppsett

I tilfelle du leter, her er funksjoner til oppsettet for eksemplene ovenfor. Resultatet oppnådd ved bruk av deklarere -f. Les mer på erklær kommandoen i bash for flere bruksområder.

Kommandoer

ord ()

seq 100

bar ()

ekko ---

old-php ()

ekko 'ereg ($ UA, "Bottybot")'

Bunnlinjen

Jeg likte å skrive Bash sed eksempler og til og med plukket opp 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 ennå å bli berørt. Sed på.

Mus Hvordan endre venstre og høyre museknapp på Windows 10 PC
Hvordan endre venstre og høyre museknapp på Windows 10 PC
Det er ganske vanlig at alle datamusenheter er ergonomisk designet for høyrehendte brukere. Men det er tilgjengelige musenheter som er spesielt design...
Mus Etterlig museklikk ved å sveve med Clickless Mouse i Windows 10
Etterlig museklikk ved å sveve med Clickless Mouse i Windows 10
Bruk av mus eller tastatur i feil stilling for overdreven bruk kan føre til mange helseproblemer, inkludert belastning, karpaltunnelsyndrom og mer. I ...
Mus Legg til musebevegelser i Windows 10 ved hjelp av disse gratisverktøyene
Legg til musebevegelser i Windows 10 ved hjelp av disse gratisverktøyene
De siste årene har datamaskiner og operativsystemer utviklet seg sterkt. Det var en tid da brukere måtte bruke kommandoer for å navigere gjennom filad...