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
12
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
- Henter antallet af linjer i en fil, L
- Genererer et tilfældigt tal mellem 1 og L, R
- 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)
35Eksempel på brug (2)
krølle https: // linuxhint.com / bash_cut_command / --silent | strip-tags | nogle-lineSe 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 50Produktion
50okay. Ser godt ud, men lad os prøve noget, der ser lidt mindre trivielt ud.
Kommandoer
erklære -xf orderklære -xf print-line
seq 1 10 $ (ord | wc -l) | xargs -i bash -c "ord | printlinje "
Produktion
111
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
- finde
- grep
- 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.
- sortere
- hoved
- hale
- grep
- kat
- Tr
- tee
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 -1Nå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 -1Det 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å.