Primeri Bash Sed

Bash Sed Examples



Bash vam omogoča, da izvedete zamenjavo vzorca z uporabo spremenljive razširitve, kot je ($ {var/vzorec/zamenjava}). Torej, ali je sed tak (sed -e ‘s/vzorec/zamenjava/’). Vendar pa je sed še več kot zamenjava vzorcev v besedilnih datotekah. Tu bomo na primer znova odkrili sed z enakovrednimi ukazi in poteki dela za pomoč pri vsakodnevnih opravilih.

Nastavitev za primere sed

Tukaj je kratek vodnik za nastavitev primera, ki ga ne bom preveč pretiraval.







besedeje besedilna datoteka, ki vsebuje številke od 1 do 100. Če niste prepričani o ukazu, ki ga želite ustvariti, glejte funkcijo izvoza za xargs v ukazu Bash Export. Nikoli ne veš, da bo to morda na tvojem naslednjem intervjuju za skriptovanje lupine.



barje besedilna datoteka, ki vsebuje eno vrstico -.



old-phpje besedilna datoteka, ki vsebuje vrstice starega PHP, ki se bodo zlomile v php7 ali novejši. (Namig: ereg)





Upoštevajte, da vse zgoraj opisane funkcije najdete spodaj v Endnotu o funkcijah za nastavitev.

Sed primeri z enakovrednimi ukazi

V okolju ukazne vrstice boste ugotovili, da je za določeno nalogo več rešitev. Večinoma pa želite iti po poti, ki daje najmanj odpora. Tu je seznam primerov ukazov sed z ustreznimi enakovrednimi ukazi, kjer bodo nekateri podrobneje obravnavani spodaj.



1. Natisnite naključno vrstico (enakovredno sortiranju -R -| glava -1)

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

2. Natisnite zadnjo vrstico v datoteki (enakovredno glavi -1 -)

sed -n '$ p'-

3. Natisnite prvih 10 vrstic v datoteki (kar ustreza glavi -n 10 -)

sed '10q'-

4. Natisnite prvo vrstico v datoteki (enakovredno rep -1 -)

sed -n '1p'-

5. Izbrišite vse primerke znaka (enakovredno tr –delete ‘0’ -, kjer je 0 znak, ki ga želimo izbrisati)

sed -In 's / 0 // g'-

6. Pretvorite datoteko csv v tsv (enakovredno tr ',' ' t' -)

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

7. Dodajte vrstico v datoteko (enakovredno mačji vrstici -)

sed '$ a ---'-

8. Predhodna vrstica v datoteko (enakovredno cat -bar)

sed '1i ---'-

9. Natisnite vse vrstice v datoteki (enakovredno cat -)

sed -n -In 'p'-

10. Natisnite vrstice, ki ustrezajo vzorcu (enakovredno grep -e ‘^1’ -)

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

11. Izbrišite vrstice, ki ustrezajo vzorcu (enakovredno grep -v -e ‘^1’ -)

sed -In '/^1/ d'-

12. Pridobite število vrstic v datoteki (enakovredno wc -l -)

sed -n -In '$ ='-

13. Pisanje v datoteko v ozadju (enakovredna ukazna majica)

sed 'v{1} USD'-

Primer uporabe sed za izvedbo ukaza tee

Tik zgoraj je primer z napisom Zapis v datoteko v ozadju. Nekako zveni kot ukaz tee. No, res je. Tukaj bomo razširili, kako implementirati funkcijo za zamenjavo tee v bash z uporabo sed.

Ukazi

majica ()
{
preskus $ {#} -ekv 1 || vrnitev;
sed 'v{1} USD'-
}
glavni()
majicato;
mačkato

glavni

Izhod

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

Tu boste videli dva seznama celih števil od 1 do 10. Prvi je iz ukaza seq. Drugo dobimo iz mačke datoteke, napisane v tee. Vem, da je smešno, vendar deluje!

Primer uporabe sed za tiskanje naključne vrstice v datoteki

Recimo, da želimo natisniti naključno vrstico v datoteki z uporabo bash in malo sed. Ali lahko to storimo? Ja lahko! Evo kako.

Izvedite funkcijo, ki

  1. Dobi število vrstic v datoteki, L
  2. Ustvari naključno število med 1 in L, R
  3. Natisne R.

Funkcija pričakuje, da bo vhod doveden od zunaj.

Ukazi

nekaj vrstice()
{
funkcijolc()
{
sed -n -In '$ ='-
};
funkcijoprint-line()
{
sed -n -In '{1} USDp '-
};
temp= $( mktemp );
mačka-> $ {temp};
mačka $ {temp} |print-line $((NAKLJUČEN%$( mačka $ {temp} |lc)+1 ));
rm $ {temp}
}

Primer uporabe (1)

seq 100 |_

Izhod (1)

35

Primer uporabe (2)

curl https://linuxhint.com/bash_cut_command/ -tiho |strip-tags|nekaj vrstice

Oglejte si spodnji primer, s katerim sed odstranite oznake HTML. Upoštevajte, da zgornji primer včasih vrne prazno za prazne vrstice. Kot vajo jo je mogoče izboljšati.

Uporaba sed za tiskanje vrstic v datoteko

Recimo, da želite implementirati funkcijo v bash, da natisnete dano vrstico v datoteki. Poskus natisniti eno vrstico v datoteki z uporabo zanke v bash, head, tail ali awk je preveč dela za tiskanje vrstic v datoteki. Še dobro, da imamo sed. Nastala funkcija z uporabo sed bi bila naslednja.

Ukazi

print-line()
{
sed -n '{1} USDp '-
}

Zdaj pa poglejmo, kaj se zgodi, ko uporabljamo print-line za besede.

Ukazi

besede|print-linepetdeset

Izhod

petdeset

V redu. Izgleda dobro, vendar poskusimo nekaj, kar izgleda nekoliko manj trivialno.

Ukazi

izjaviti -xfbesede
izjaviti -xfprint-line
seq 1 10$(besede| stranišče - ) | xargs-jazbash -c 'besede | print-line {} '

Izhod

1
enajst
enaindvajset
31
41
51
61
71
81
91

V redu. Zdaj je to bolj podobno! Vidite, kako se lahko sed uporabi v bash skriptu za tiskanje katere koli vrstice v datoteki.

Sed primeri brez enakovrednih ukazov

V okolju ukazne vrstice je včasih pot do rešitve z najmanjšim uporom sed način; sicer boste na koncu opravili več dela, kot je potrebno. Spodaj so predstavljeni nekateri ukazi.

Ukažite vse vrstice v skriptu lupine

sed -In 's/^/#/'-
Izbrišite prvo vrstico
sed -In '1d'-
Izbrišizadnjivrstica
sed -In '$ d'-
Vrstico vstavite pred vrstice, ki ustrezajo vzorcu
sed '/0 $/i ---'-
Vnesite vrstico za vrstice, ki ustrezajo vzorcu
sed ' / 0 $ / ---'-
Odstranite oznake html
sed -In 's/*** .// g'-
Nadgradi eregvstara php koda za zagonvphp7 ali novejši
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Preveriteče sedje starejša od določene različice
sed -In 'v 4.5'-

Primer sed različice, ki se razveja v bash

Zgoraj v primerih je vrstica za preverjanje, če je sed starejša od določene različice, ki jo lahko uporabimo za implementacijo razvejanja različic v bash, kar je po mojem mnenju lažje kot poskus izvajanja funkcije za primerjavo številk različic iz sed -verzije . Edina napaka je, da če obstaja starejša različica sed, ki ne podpira ukaza u, smo v težavah.

Ukazi

test-sed-version-at-most() {
vrgel ven -n | sed 'v{1} USD'-2> /dev/nič
}
poskusna različica()
{
vrgel ven -n 'Različica{1} USD. V redu. Naredi ';
test-sed-version-at-most{1} USD && {
vrgel ven -n 'star';
prav
} || {
vrgel ven -n 'novo'
};
vrgel ven 'način.'
}
glavni()
{
lokalnov;
zavv 4.{4,5};
naredi
poskusna različica$ {v};
Končano
}
glavni

Izhod

Različica4.4. V redu. Naredi po starem.
Različica4.5. V redu. Naredite to na nov način.

Upoštevajte, da je različica sed, ki se pri vnosu teh znakov izvaja na mojem računalniku, 4.4, kar bi pojasnilo zgornji izhod. Prav tako je bila hkrati zadnja različica gnu sed 4.7, približno 3 leta starejša od moje. Moj sed je star! Pravzaprav je bil v sed 4.0.6 ukazu različice dodan parameter, zato ta strategija deluje za vse omenjene vsaj v4.0.6, kar je prizanesljivo glede na to, da je bila različica izdana v začetku leta 2003. Dobro ste.

Nekaj ​​sem še brskal, pravzaprav NOVICE prebral iz najnovejše izvorne kode. Različica 4.6 ima novo funkcijo - debug, ki izpiše skript in označi izhodne vrstice. To bi vam omogočilo prevod skriptov sed, ki jih generirajo funkcije, v bash v kanonično obliko. Kul! Samo ne pozabite, da potrebujete sed različico, ki se razveja v bash. Tu nastopi ta primer sed.

Primer funkcije bash z uporabo sed za odstranjevanje oznak HTML

V zgornjih primerih je vrstica za odstranitev oznak HTML. Vrzimo to v funkcijo bash in z njo odstranimo vse oznake HTML iz zadnjega članka, ki sem ga napisal.

Ukazi

strip-tags()
{
sed -In 's/*** .// g'-
}
curl https://linuxhint.com/bash_cut_command/ -tiho |strip-tags

Ne morem reči, da je popoln, vendar je vsaj berljiv v terminalu.

Primeri sed s poteki dela: Primer poteka dela: varno zamenjajte vse z uporabo find, grep in sed

Lahko rečemo, da so spremembe, narejene z uporabo sed z možnostjo -i, nepopravljive. Če ne boste popolnoma prepričani, katero besedilo želite zamenjati, boste verjetno na koncu dobili en znak manj, kot je bilo predvideno. Zato bomo v tem primeru v delovnem toku uporabili sed za varno zamenjavo besedila v vseh datotekah, ki ste jih izbrali.

Potek dela

  1. najti
  2. oprijem
  3. sed
najti

Tu boste izbrali datoteke, ki jih je treba zamenjati. Predlagam, da uporabite ukaz v teh vrsticah:

najti -tipf-ime | oprijem -v-In| xargs-jaz ...

Na primer, morda želite omejiti datoteke, da nadomestijo datoteke PHP, razen imenikov skladišča git, kot sledi.

najti -tipf-ime*.php| oprijem -v -In '.go' | xargs -jaz...

Preberite več o ukazu xargs v bash.

oprijem

Nato bomo poskušali ujemati some_pattern v datotekah, izbranih na naslednji način. Upoštevajte, da ker za grep uporabljamo možnost -o, bo izhod prikazal le ujemajoči se niz, če obstaja.

najti -tipf-ime*.php| oprijem -v -In '.go' |
xargs -jaz oprijem -Insome_pattern-ali

Zgornji ukaz bi moral vrniti seznam nizov, ki se ujemajo z some_pattern.

sed

Nazadnje želimo zamenjati ves niz, ki se ujema z some_pattern. Če želite to narediti, moramo grep pretvoriti v sed na naslednji način.

najti -tipf-ime*.php| oprijem -v -In '.go' |
xargs -jaz sed -jaz -Ins/some_pattern/zamenjavo/g

Ukaz grep postane sed -i in možnost -o se odstrani. In tukaj imate.

Zdaj lahko namesto preizkušanja sreče preverite, katere vrste bodo zamenjane v sed.

Opombe o možnostih, ki se uporabljajo v primerih

Tu je seznam možnosti, ki so na kratko opisane v primerih sed.

Možnost Opis
-jaz Uredite na mestu. Če je vnos datoteka (ni vstavljena), bo rezultat izrazov prepisal vsebino datoteke.

Sed sprejme eno

npr) sed -n ...

-In -e pomeni izraz. Njegov parameter je izraz v sed jeziku.

Sed sprejema mnoge

npr) sed -e'expr1 '-e'expr2'

-n Skriva vrstico, na katero izraz ne vpliva. To pomeni, da če je izraz izjava za tiskanje v jeziku sed, potem vrstice, ki niso vključene v izjavo za tiskanje, ne bodo vključene v izpis.

npr) sed -n ...

Za več informacij o razpoložljivih možnostih sed glejte sed –help

Končne opombe o enakovrednih ukazih uporabite v primerih

Naslednji pripomočki ukazne vrstice so vključeni v primere sed z enakovrednimi ukazi.

  • razvrsti
  • glavo
  • rep
  • oprijem
  • mačka
  • NS
  • majica

Opomba na koncu - na primer enakovredni ukazi

Če se sprašujete, kaj se dogaja z znakom - v tem primeru, je ta opomba za vas. Za večino ukazov v primerih sem dodal znak -, da bi namignil, da pričakujemo, da bo vnos sprejet po kanalu. Se pravi,

mačkasome-file| razvrsti -R-| glavo -1

Ko pa je ukaz na levi strani cevi prisoten, lahko namig izpustimo na naslednji način.

mačkasome-file| razvrsti -R | glavo -1

To se je dogajalo z znaki - za ukazi v primerih.

Opombe o funkcijah za nastavitev

Če iščete, so tukaj nastavitvene funkcije za zgornje primere. Rezultat, pridobljen z uporabo deklariranja -f. Preberite več o deklariranju ukaza v bash za več uporab.

Ukazi

besede()
{
seq 100
}
bar()
{
vrgel ven ---
}
old-php()
{
vrgel ven 'ereg ($ UA,' Bottybot ')'
}

Spodnja črta

Užival sem v pisanju primerov Bash sed in ob tem celo pobral nekaj dodatnih trikov. Sed je zmogljiv pripomoček ukazne vrstice in izrazen jezik za upravljanje besedilnih datotek. Če vam je bilo všeč učenje o sed, ne skrbite, da se morate dotakniti še veliko več. Sedi naprej.