sed

Eksempler på Bash Sed

Eksempler på Bash Sed
Bash giver dig mulighed for at udføre mønsterudskiftning ved hjælp af variabel udvidelse som ($ var / mønster / erstatning)). Og så gør sed sådan her (sed -e / mønster / erstatning / '). Der er dog mere at sed end at erstatte mønstre i tekstfiler.  Her genopdager vi f.eks. Sed med tilsvarende kommandoer og arbejdsgange til hjælp i daglige opgaver.

Opsætning af sed eksempler

Her er en hurtig guide til at få klar til eksemplet, som jeg vil forsøge ikke at gøre for meget.

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

“Bar” er en tekstfil, der indeholder en enkelt linje -.

“Old-php” er en tekstfil, der indeholder linjer med gammel PHP, der bryder i php7 eller senere. (Tip: ereg)

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

Sed eksempler med tilsvarende kommandoer

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

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

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

2.Udskriv den sidste linje i filen (svarende 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 (svarer til halen -1 -)

sed -n '1p' -

5. Slet alle forekomster af et tegn (svarende til tr -delete '0' -, hvor 0 er det tegn, vi vil slette)

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

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

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

7.Tilføj linje til fil (svarende til cat bar -)

sed '$ a ---' -

8. Forbered linje til fil (svarende til cat-bar)

sed '1i ---' -

9. Udskriv alle linjer i filen (svarende til kat -)

sed -n -e 'p' -

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

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

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

sed -e '/ ^ 1 / d' -

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

sed -n -e '$ =' -

13. Skriv til en fil i baggrunden (tilsvarende kommandotee)

sed "w $ 1" -

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

Lige over er der et eksempel mærket Skriv til en fil i baggrunden. En slags lyde som tee-kommandoen. Nå, det er det. Her vil vi udvide, hvordan man implementerer en funktion til erstatning af tee in bash ved hjælp af sed.

Kommandoer

tee ()

test $ # -eq 1 || Vend tilbage;
sed "w $ 1" -

hoved ()

seq 10 | tee ti;
kat ti

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 lister over heltalene fra 1 til 10. Den første er fra seq-kommandoen. Det andet vi får 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 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 indgangen skal røres udefra.

Kommandoer

nogle-line ()

funktion lc ()

sed -n -e '$ =' -
;
funktion print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
kat -> $ temp;
kat $ temp | printlinje $ ((RANDOM% $ (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 / --silent | strip-tags | nogle-line

Se eksemplet nedenfor ved hjælp af sed til at strippe HTML-tags. Bemærk, at overeksemplet nogle gange 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 sløjfe i bash, hoved, hale eller awk er for meget arbejde til at udskrive linjer i en fil. God ting, 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 printlinje på ord.

Kommandoer

ord | printlinje 50

Produktion

50

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

Kommandoer

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

Produktion

1
11
21
31
41
51
61
71
81
91

okay. Nu er det mere som det! Du ser, hvordan sed kan bruges i et bash-script til at udskrive en hvilken som helst linje i en fil.

Sed eksempler uden tilsvarende kommandoer

I et kommandolinjemiljø er stien til en løsning, der giver mindst modstand, undertiden den sed vej; Ellers ender du med at udføre mere arbejde end krævet i første omgang. Nogle kommandoer kan vises nedenfor.

Kommandér alle linjer i et shell-script

sed -e 's / ^ / # /' -
Slet første linje
sed -e '1d' -
Slet sidste linje
sed -e '$ 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 -e 's /<[^>] *.// g ' -
Opgrader ereg i gammel php-kode for at køre i php7 eller nyere
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Kontroller, om sed er tidligere end en bestemt version
sed -e 'v 4.5 ' -

Eksempel på sed-version forgrenet i bash

Oven i eksemplerne er der en linje til at kontrollere, om sed er tidligere end en bestemt version, som vi kan bruge til at implementere version forgrening i bash, hvilket jeg mener er lettere end at forsøge at implementere en funktion til at sammenligne versionsnumre fra sed -version output. 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 ()
ekko -n | sed "v $ 1" - 2> / dev / null

prøveversion ()

ekko -n "Version $ 1. okay. Gør det ";
test-sed-version-højst $ 1 &&
ekko -n "gammel";
rigtigt
||
ekko -n "nyt"
;
ekko "måde."

hoved ()

lokal v;
for v i 4.4,5
gør
prøveversion $ v;
Færdig

vigtigste

Produktion

Version 4.4. okay. Gør det på den gamle måde.
Version 4.5. okay. Gør det på den nye måde.

Bemærk, at versionen af ​​sed, der kører på min maskine, når jeg skriver disse tegn, er 4.4, hvilket ville forklare output ovenfor. Samtidig var den nyeste version af GNU Sed 4.7, cirka 3 år ældre end den jeg har. Min sed er gammel! Faktisk i sed 4.0.6, blev der tilføjet en parameter til versionskommandoen, så denne strategi fungerer for alle nævnte mindst v4.0.6, hvilket er mildt i betragtning af, at versionen blev udgivet i begyndelsen af ​​2003. Du er god.

Jeg lavede noget ekstra grave, faktisk NEWS læsning af den nyeste kildekode. Version 4.6 har en ny funktion, -debug, som dumper scriptet og kommenterer outputlinjer. Dette giver 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 kommer i spil.

Eksempel på bash-funktion ved hjælp af sed til at strippe HTML-tags

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

Kommandoer

strip-tags ()

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

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

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

Sed-eksempler med arbejdsgange: Eksempel på workflow: udskift 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 bruger vi i dette eksempel sed i en arbejdsgang til sikkert at erstatte tekst i alle filer, du har valgt.

Workflow

  1. finde
  2. grep
  3. sed
finde

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

find -type f -navn | grep -v -e | xargs -i…

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

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

Læs mere om xargs-kommandoen i bash.

grep

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

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

Kommandoen ovenfor skal returnere en liste med streng, der matcher noget_mønster.

sed

Endelig vil vi erstatte al streng, der matcher noget_mønster. For at gøre det skal vi konvertere grep til sed som følger.

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

Grep-kommandoen bliver sed -i, og indstillingen -o 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 anvendes i eksempler

Her er en liste over muligheder, der bruges i de sed eksempler, der diskuteres kort.

Mulighed Beskrivelse
-jeg Rediger på plads. Hvis input er en fil (ikke pipet ind) overskriver resultatet af udtryk indholdet af filen.

Sed accepterer en

fx) sed -n ..

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

Sed accepterer mange

fx) sed -e 'expr1' -e 'expr2' ..

-n Skjuler linje, der ikke er påvirket af udtrykket. Det vil sige, hvis udtrykket er en udskrivningserklæring på sed-sproget, vil linjer, der ikke er inkluderet i udskriftserklæringen, ikke medtages i output.

fx) sed -n ..

For mere information om tilgængelige indstillinger, se sed -help

Slutnoter om tilsvarende kommandoer bruges i eksempler

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

Slutnote om efterfølgende - i eksempel tilsvarende kommandoer

Hvis du spekulerer på, hvad der foregår - tegnet i eksemplet, er denne note til 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,

kat noget-fil | sorter -R - | hoved -1

Når kommandoen på venstre side af røret er til stede, kan vi dog udelade tipet som følger.

kat noget-fil | sorter -R | hoved -1

Det er, hvad der foregik med kommandoer - karakter efter kommandoer i eksemplerne.

Slutnoter om funktioner til opsætning

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

Kommandoer

ord ()

sek. 100

bar ()

ekko ---

old-php ()

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

Bundlinie

Jeg nød at skrive Bash sed-eksempler og hentede 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, skal du ikke bekymre dig, der er stadig meget mere at røre ved. Sed på.

HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...
Sådan bruges AutoKey til at automatisere Linux-spil
AutoKey er et desktopautomatiseringsværktøj til Linux og X11, programmeret i Python 3, GTK og Qt. Ved hjælp af dets scripting og MACRO-funktionalitet ...
Sådan vises FPS-tæller i Linux-spil
Linux-spil fik et stort skub, da Valve annoncerede Linux-support til Steam-klient og deres spil i 2012. Siden da har mange AAA- og indiespil fundet ve...