Bash Sed Eksempler

Bash Sed Examples



Bash giver dig mulighed for at udføre mønsterudskiftning ved hjælp af variabel ekspansion som ($ {var/pattern/replacement}). Og så kan sed lide dette (sed -e ‘s/mønster/udskiftning/’). Der er dog mere at gøre end at udskifte mønstre i tekstfiler. Her vil vi genopdage sed, f.eks. Med tilsvarende kommandoer og arbejdsgange for at hjælpe med daglige opgaver.

Opsætning til sed eksempler

Her er en hurtig guide til at få sat op til eksemplet, som jeg vil prøve ikke at gøre for overkill.







order en tekstfil, der indeholder tallene 1 til 100. Hvis du er usikker på kommandoen til at oprette den, kan du se Eksportfunktion for xargs i Bash Export Command. Du ved aldrig, at det kan være på dit næste shell -scriptinginterview.



barer en tekstfil, der indeholder en enkelt linje -.



gammel-phper en tekstfil, der indeholder linjer med gammel PHP, der vil bryde i php7 eller senere. (Tip: ereg)





Bemærk, at alle de funktioner, der er beskrevet ovenfor, findes nedenfor i Endnote om funktioner til opsætning.

Sed eksempler med tilsvarende kommandoer

I et kommandolinjemiljø finder du, at der er mere end én løsning på en given opgave. Men for det meste vil du gå med den vej, der giver mindst modstand. Her er en liste over eksempler sed kommandoer med tilsvarende ækvivalente kommandoer, hvor nogle vil blive dækket i detaljer nedenfor.



1. Udskriv en tilfældig linje (svarende til sortering -R -| hoved -1)

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

2.Udskriv den sidste linje i filen (svarer til head -1 -)

sed -n '$ p'-

3. Udskriv de første 10 linjer i en fil (svarende til head -n 10 -)

sed '10q'-

4. Udskriv den første linje i en fil (svarende til hale -1 -)

sed -n '1p'-

5. Slet alle forekomster af et tegn (svarer til tr –delete ‘0’ -, hvor 0 er det tegn, vi vil slette)

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

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

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

7. Tilføj linje til fil (svarer til kattebjælke -)

sed '$ a ---'-

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

sed '1i ---'-

9. Udskriv alle linjer i filen (svarer til cat -)

sed -n -Og 'p'-

10. Udskriv en linje, der matcher et mønster (svarer til grep -e ‘^1’ -)

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

11. Slet linjer, der matcher et mønster (svarer til grep -v -e ‘^1’ -)

sed -Og '/^1/ d'-

12. Få antallet af linjer i en fil (svarende til wc -l -)

sed -n -Og '$ ='-

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

sed 'i$ {1}'-

Eksempel på brug af sed til at implementere tee -kommandoen

Lige ovenfor er der et eksempel mærket Skriv til en fil i baggrunden. Lyder lidt som tee -kommandoen. Det er det. Her vil vi udvide, hvordan man implementerer en funktion til at erstatte tee i bash ved hjælp af sed.

Kommandoer

tee ()
{
prøve $ {#} -ækv 1 || Vend tilbage;
sed 'i$ {1}'-
}
vigtigste()
teedet her;
katdet her

vigtigste

Produktion

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 fortegnelser over heltalene fra 1 til 10. Den første er fra kommandoen seq. Den anden får vi fra katten i filen skrevet i tee. Jeg ved, det er latterligt, men det virker!

Eksempel på brug af sed til at udskrive en tilfældig linje i en fil

Antag, at vi vil udskrive en tilfældig linje i en fil ved hjælp af bash og en lille smule sed. Kan vi gøre det? Ja vi kan! Sådan gør du.

Implementere en funktion, der

  1. Henter antallet af linjer i en fil, L
  2. Genererer et tilfældigt tal mellem 1 og L, R
  3. Udskriver R

Funktionen forventer, at input bliver ledet udefra.

Kommandoer

nogle-linje()
{
fungerelc()
{
sed -n -Og '$ ='-
};
fungereprint-line()
{
sed -n -Og '$ {1}p '-
};
Midlertidig= $( mktemp );
kat-> $ {temp};
kat $ {temp} |print-line $((TILFÆLDIG%$( kat $ {temp} |lc)+1 ));
rm $ {temp}
}

Eksempel på brug (1)

seq 100 |_

Output (1)

35

Eksempel på brug (2)

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

Se eksemplet herunder ved at bruge sed til at fjerne HTML -tags. Bemærk, at overeksemplet undertiden returnerer tomt for tomme linjer. Som en øvelse kan den forbedres.

Brug sed til at udskrive linjer i en fil

Antag, at du vil implementere en funktion i bash for at udskrive en given linje i en fil. At prøve at udskrive en enkelt linje i en fil ved hjælp af en loop i bash, hoved, hale eller awk er for meget arbejde til at udskrive linjer i en fil. Godt vi har sed. Den resulterende funktion ved anvendelse af sed ville være som følger.

Kommandoer

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

Lad os nu se, hvad der sker, når vi bruger print-line på ord.

Kommandoer

ord|print-linehalvtreds

Produktion

halvtreds

Okay. Ser godt ud, men lad os prøve noget, der ser lidt mindre trivielt ud.

Kommandoer

erklære -xford
erklære -xfprint-line
seq 1 10$(ord| Toilet -det ) | xargs-jegbash -c 'ord | print-line {} '

Produktion

1
elleve
enogtyve
31
41
51
61
71
81
91

Okay. Nu ligner det mere det! Du ser, hvordan sed kan bruges i et bash -script til at udskrive enhver linje i en fil.

Sed eksempler uden tilsvarende kommandoer

I et kommandolinjemiljø er vejen til en løsning, der giver mindst modstand, undertiden den sed måde; ellers ender du med at udføre mere arbejde end først krævet. Nogle kommandoer vises muligvis herunder.

Kommander alle linjer i et shell -script

sed -Og 's/^/#/'-
Slet første linje
sed -Og '1d'-
Sletsidstlinje
sed -Og '$ d'-
Indsæt en linje før linjer, der matcher et mønster
sed '/0 $/i ---'-
Indsæt en linje efter linjer, der matcher et mønster
sed ' / 0 $ / ---'-
Fjern html -tags
sed -Og 's /†*.// g'-
Opgrader eregigammel php -kode til at køreiphp7 eller senere
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Kontrollerehvis seder tidligere end en bestemt version
sed -Og 'v 4,5'-

Eksempel sed version forgrening i bash

Oven i eksemplerne er der en linje til Kontroller, om sed er tidligere end en bestemt version, som vi kan bruge til at implementere version forgrening i bash, som jeg mener er lettere end at prøve at implementere en funktion til at sammenligne versionsnumre fra sed –versionsoutput . Den eneste faldgrube er, at hvis der er en tidligere version af sed, der ikke understøtter v -kommandoen, så er vi i problemer.

Kommandoer

test-sed-version-at-most() {
smed ud -n | sed 'v$ {1}'-2> /dev/nul
}
prøve-version()
{
smed ud -n 'Version$ {1}. Okay. Gør det ';
test-sed-version-at-most$ {1} && {
smed ud -n 'gammel';
sand
} || {
smed ud -n 'ny'
};
smed ud 'måde.'
}
vigtigste()
{
lokalv;
tilvi 4.{4,5};
gøre
prøve-version$ {v};
Færdig
}
vigtigste

Produktion

Version4.4. Okay. Gør det på den gamle måde.
Version4.5. Okay. Gør det på den nye måde.

Bemærk, at versionen af ​​sed, der kører på min maskine ved indtastning af disse tegn, er 4,4, hvilket ville forklare outputtet ovenfor. På samme tid var den nyeste version af gnu sed 4.7, cirka 3 år ældre end den, jeg har. Min sed er gammel! Faktisk blev der i sed 4.0.6 tilføjet en parameter til versionskommandoen, så denne strategi fungerer for enhver sagt mindst v4.0.6, hvilket er mildt i betragtning af at versionen blev udgivet i begyndelsen af ​​2003. Du er god.

Jeg lavede lidt ekstra gravering, faktisk NEWS ved at læse den nyeste kildekode. Version 4.6 har en ny funktion, –debug, som dumper scriptet og kommenterer outputlinjer. Dette ville give dig mulighed for at oversætte sed scripts genereret af funktioner i bash til kanonisk form. Fedt nok! Bare glem ikke, at du har brug for sed version forgrening i bash. Det er her dette sed eksempel spiller ind.

Eksempel bash -funktion ved hjælp af sed til at fjerne HTML -tags

I eksemplerne ovenfor er der en linje til at fjerne HTML -tags. Lad os kaste det ind i en bash -funktion og bruge det til at fjerne alle HTML -tags fra den sidste artikel, jeg skrev.

Kommandoer

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

Jeg kan ikke sige, at det er perfekt, men det er i det mindste læsbart i terminalen.

Sed eksempler med arbejdsgange: Eksempel på arbejdsgang: erstat sikkert alle ved hjælp af find, grep og sed

Det er sikkert at sige, at ændringer foretaget ved hjælp af sed med -i -indstillingen er irreversible. Det er medmindre du er helt sikker på, hvilken tekst der skal udskiftes, ender du sandsynligvis med et tegn mindre end beregnet. Derfor vil vi i dette eksempel bruge sed i en arbejdsgang til sikkert at erstatte tekst i alle filer, du har valgt.

Workflow

  1. Find
  2. greb
  3. sed
Find

Her vælger du de filer, der skal udskiftes. Jeg foreslår at bruge en kommando i retning af disse linjer:

Find -typef-navn | greb -v-Og| xargs-jeg ...

For eksempel vil du måske begrænse filerne til at erstatte PHP -filer undtagen git repository -mapper som følger.

Find -typef-navn*.php| greb -v -Og '.gå' | xargs -jeg...

Læs mere om xargs -kommandoen i bash.

greb

Dernæst vil vi prøve at matche some_pattern i de valgte filer som følger. Bemærk, at da vi bruger indstillingen -o til grep, viser output kun matchet streng, hvis nogen.

Find -typef-navn*.php| greb -v -Og '.gå' |
xargs -jeg greb -Ognoget_mønster-eller

Kommandoen ovenfor skal returnere en liste over strenge, der matcher some_pattern.

sed

Endelig vil vi erstatte alle strenge, der matcher some_pattern. For at gøre det skal vi konvertere grep til sed som følger.

Find -typef-navn*.php| greb -v -Og '.gå' |
xargs -jeg sed -jeg -Ogs/noget_mønster/udskiftning/g

Grep -kommandoen bliver sed -i, og -o -indstillingen fjernes. Og der har du det.

Nu kan du kontrollere, hvilke strenge der skal udskiftes i sed på forhånd i stedet for at teste dit held.

Slutnoter om muligheder, der bruges i eksempler

Her er en liste over muligheder, der bruges i sed eksemplerne diskuteret kort.

Mulighed Beskrivelse
-jeg Rediger på plads. Hvis input er en fil (ikke piped ind) vil resultatet af udtryk overskrive filens indhold.

Sed accepterer en

fx) sed -n ...

-Og -e står for udtryk. Dens parameter er et udtryk i det sed sprog.

Sed tager imod mange

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

-n Skjuler linje, der ikke påvirkes af udtrykket. Det vil sige, at udtrykket er en udskriftssætning på sed -sproget, så vil linjer, der ikke er inkluderet i udskriftssætningen, ikke blive inkluderet i output.

fx) sed -n ...

For mere om tilgængelige sed -muligheder, se sed –help

Slutnoter om tilsvarende kommandoer bruges i eksempler

Følgende kommandolinjeværktøjer er inkluderet i sed-eksemplerne med tilsvarende kommandoer.

  • sortere
  • hoved
  • hale
  • greb
  • kat
  • NS
  • tee

Slutnote om den efterfølgende - f.eks. Tilsvarende kommandoer

Hvis du undrer dig over, hvad der foregår - -tegnet i eksemplet, er denne note noget for dig. Jeg tilføjede et - tegn efter de fleste kommandoer i eksemplerne for at antyde, at vi forventer, at input modtages gennem et rør. Det er,

katen eller anden fil| sortere -R-| hoved -1

Når kommandoen på venstre hånd røret er til stede, kan vi imidlertid udelade antydningen som følger.

katen eller anden fil| sortere -R | hoved -1

Det var det, der foregik med - -tegnet efter kommandoer i eksemplerne.

Slutnoter om funktioner til opsætning

Hvis du leder, er her funktioner til opsætningen af ​​ovenstående eksempler. Outputtet opnået ved hjælp af declare -f. Læs mere om kommandoen deklar i bash for flere anvendelser.

Kommandoer

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

Bundlinie

Jeg nød at skrive Bash sed -eksempler og tog endda et par ekstra tricks undervejs. Sed er et kraftfuldt kommandolinjeværktøj og udtryksfuldt sprog til manipulation af tekstfiler. Hvis du kunne lide at lære om sed, bare rolig, der er stadig meget mere, der skal røres. Sed på.