Príklady Bash Sed

Bash Sed Examples



Bash vám umožňuje vykonávať výmenu vzoru pomocou variabilného rozšírenia, ako je ($ {var/pattern/replacement}). A tak to robí aj sed takto (sed -e 's/vzor/nahradenie/'). V textových súboroch je však viac sedenia ako nahrádzania vzorov. Tu znova objavíme sed, napríklad s ekvivalentnými príkazmi a pracovnými postupmi, ktoré vám pomôžu pri každodenných úlohách.

Nastavenie pre príklady sed

Tu je rýchly návod, ako sa pripraviť na príklad, ktorý sa pokúsim neurobiť príliš prehnane.







slováje textový súbor obsahujúci čísla 1 až 100. Ak si nie ste istí príkazom na jeho vytvorenie, pozrite si časť Exportná funkcia pre xargs v Bash Export Command. Nikdy neviete, že to môže byť pri ďalšom rozhovore o skriptovaní škrupín.



barje textový súbor obsahujúci jeden riadok -.



old-phpje textový súbor obsahujúci riadky starého PHP, ktoré sa zlomia v php7 alebo novšom. (Tip: ereg)





Všimnite si toho, že všetky vyššie popísané funkcie nájdete nižšie v Endnote o funkciách pre nastavenie.

Sed príklady s ekvivalentnými príkazmi

V prostredí príkazového riadka zistíte, že existuje viac ako jedno riešenie danej úlohy. Väčšinou však chcete ísť cestou, ktorá kladie najmenší odpor. Tu je zoznam príkladov príkazov sed s príslušnými ekvivalentnými príkazmi, pričom niektoré z nich budú podrobne popísané nižšie.



1. Vytlačte náhodný riadok (ekvivalent k zoradeniu -R -| hlava -1)

sed -n '$ ((NÁHODNÝ % 100)) p '-

2. Vytlačte posledný riadok v súbore (ekvivalent hlavy -1 -)

sed -n '$ p'-

3. Vytlačte prvých 10 riadkov do súboru (ekvivalent k hlavičke -n 10 -)

sed '10q'-

4. Vytlačte prvý riadok v súbore (ekvivalent chvosta -1 -)

sed -n '1p'-

5. Odstráňte všetky inštancie znaku (ekvivalent tr –delete ‘0’ -, kde 0 je znak, ktorý chceme odstrániť)

sed -A 's / 0 // g'-

6. Previesť súbor csv na tsv (ekvivalent tr ‘,‘ ‘ t’ -)

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

7. Pripojte riadok k súboru (ekvivalent k pruhu mačky -)

sed '$ a ---'-

8. Pripojte riadok k súboru (ekvivalent k stĺpcu s čiarou)

sed „1i ---“-

9. Vytlačte všetky riadky v súbore (ekvivalent mačky -)

sed -n -A 'p'-

10. Vytlačte riadky zodpovedajúce vzoru (ekvivalent grep -e „^1“ -)

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

11. Odstráňte riadky zodpovedajúce vzoru (ekvivalent grep -v -e ‘^1‘ -)

sed -A '/^1/ d'-

12. Zistite počet riadkov v súbore (ekvivalent wc -l -)

sed -n -A '$ ='-

13. Napíšte do súboru na pozadí (ekvivalentné príkazové pole)

sed 'v{1} $'-

Príklad pomocou sed na implementáciu príkazu tee

Hneď hore je príklad označený ako Zápis do súboru na pozadí. Znie to ako príkaz tee. Tak to je. Tu sa budeme zaoberať tým, ako implementovať funkciu nahradzujúcu odpalisko v bash pomocou sed.

Príkazy

tričko ()
{
test {$} $ -ekv 1 || vrátiť sa;
sed 'v{1} $'-
}
Hlavná()
tričkototo;
kattoto

Hlavná

Výkon

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

Tu uvidíte dva zoznamy celých čísel od 1 do 10. Prvý je z príkazu seq. Druhé dostaneme od mačky súboru napísaného v odpalisku. Viem, je to smiešne, ale funguje to!

Príklad použitia sed na vytlačenie náhodného riadka v súbore

Predpokladajme, že chceme vytlačiť náhodný riadok v súbore pomocou bash a trochu sed. Zvládneme to? Áno, môžme! Tu je postup.

Implementujte funkciu, ktorá

  1. Zistí počet riadkov v súbore, L
  2. Generuje náhodné číslo medzi 1 a L, R.
  3. Tlačí R.

Funkcia očakáva, že vstup bude potrubím zvonku.

Príkazy

nejaký-riadok()
{
funkciulc()
{
sed -n -A '$ ='-
};
funkciutlačový riadok()
{
sed -n -A '{1} $p '-
};
tepl= $( mktemp );
kat-> $ {temp};
kat $ {temp} |tlačový riadok $((NÁHODNÝ%$( kat $ {temp} |lc)+1 ));
rm $ {temp}
}

Príklad použitia (1)

nasl 100 |_

Výstup (1)

35

Príklad použitia (2)

zvinutie https://linuxhint.com/bash_cut_command/ -tichý |strip-tagy|nejaký-riadok

Pozrite sa na príklad nižšie s použitím kódu sed na odstránenie značiek HTML. Všimnite si toho, že uvedený príklad niekedy vráti prázdne riadky. Ako cvičenie sa to dá zlepšiť.

Použitie sed na tlač riadkov v súbore

Predpokladajme, že chcete v bash implementovať funkciu na vytlačenie daného riadka v súbore. Pokúšať sa vytlačiť jeden riadok v súbore pomocou slučky v bash, head, tail alebo awk je príliš veľa práce na vytlačení riadkov v súbore. Ešte dobre, že máme sed. Výsledná funkcia pomocou sed by bola nasledovná.

Príkazy

tlačový riadok()
{
sed -n '{1} $p '-
}

Teraz sa pozrime, čo sa stane, keď použijeme tlačový riadok na slová.

Príkazy

slová|tlačový riadokpäťdesiat

Výkon

päťdesiat

Dobre. Vyzerá to dobre, ale skúsme niečo, čo vyzerá o niečo menej triviálne.

Príkazy

vyhlásiť -xfslová
vyhlásiť -xftlačový riadok
nasl 1 10$(slová| wc -ten ) | xargs-ibash -c 'slová | print-line {} '

Výkon

1
jedenásť
dvadsaťjeden
31
41
51
61
71
81
91

Dobre. Teraz je to viac podobné! Vidíte, ako sa dá sed v skripte bash použiť na vytlačenie ľubovoľného riadka v súbore.

Sed príklady bez ekvivalentných príkazov

V prostredí príkazového riadka je niekedy cesta k riešeniu, ktoré vyvoláva najmenší odpor, cestou sed; inak v konečnom dôsledku urobíte viac práce, ako sa v prvom rade vyžaduje. Niektoré príkazy môžu byť uvedené nižšie.

Príkaz na všetky riadky v skripte shell

sed -A 's/^/#/'-
Odstráňte prvý riadok
sed -A '1d'-
Vymazaťposlednýriadok
sed -A '$ d'-
Vložte riadok pred riadky zodpovedajúce vzoru
sed '/0 $/i ---'-
Vložte riadok za riadky zodpovedajúce vzoru
sed ' / 0 $ / ---'-
Odstráňte html značky
sed -A 's /antine*.// g'-
Aktualizovať eregvstarý php kód na spustenievphp7 alebo novší
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Skontrolovaťkeby sedje staršia ako určitá verzia
sed -A „v 4.5“-

Príklad vetvenia verzie sed v bash

Vyššie v príkladoch je riadok na kontrolu, či je sed starší ako určitá verzia, ktorý môžeme použiť na implementáciu vetvenia verzií v bash, čo je podľa mňa jednoduchšie ako pokúšať sa implementovať funkciu na porovnanie čísel verzií z výstupu sed –version . Jediným úskalím je, že ak existuje staršia verzia sed, ktorá nepodporuje príkaz v, máme problémy.

Príkazy

test-sed-verzia-nanajvýš() {
zahodil -n | sed 'v{1} $'-2> /dev/nulový
}
skúsiť verziu()
{
zahodil -n „Verzia{1} $. Dobre. Urob to ';
test-sed-verzia-nanajvýš{1} $ && {
zahodil -n „starý“;
pravda
} || {
zahodil -n 'Nový'
};
zahodil 'spôsob.'
}
Hlavná()
{
miestnyv;
prevv 4.{4,5};
urobiť
skúsiť verziu$ {v};
hotový
}
Hlavná

Výkon

Verzia4.4. Dobre. Urob to starým spôsobom.
Verzia4.5. Dobre. Urob to novým spôsobom.

Všimnite si toho, že verzia sed bežiaca na mojom počítači pri zadávaní týchto znakov je 4.4, čo by vysvetľovalo výstup vyššie. Súčasne bola najnovšia verzia gnu sed 4,7, asi o 3 roky staršia ako tá, ktorú mám. Môj sed je starý! V skutočnosti v sede 4.0.6 bol do príkazu verzie pridaný parameter, takže táto stratégia funguje pre všetky uvedené verzie aspoň v4.0.6, ktoré sú zhovievavé vzhľadom na to, že verzia bola vydaná začiatkom roku 2003. Ste dobrí.

Urobil som nejaké extra kopanie, vlastne NOVINKY, ktoré som čítal z najnovšieho zdrojového kódu. Verzia 4.6 má novú funkciu - ladenie, ktoré ukladá skript a anotuje výstupné riadky. To vám umožní preložiť sed skripty generované funkciami v bash do kanonickej podoby. Super! Nezabudnite, že v bash potrebujete vetvenie verzie sed. Tu vstupuje do hry tento sed príklad.

Príklad funkcie bash používajúcej sed na odstraňovanie značiek HTML

Vo vyššie uvedených príkladoch je riadok na odstránenie značiek HTML. Vrhnime to do funkcie bash a použijeme to na odstránenie všetkých značiek HTML z posledného článku, ktorý som napísal.

Príkazy

strip-tagy()
{
sed -A 's /antine*.// g'-
}
zvinutie https://linuxhint.com/bash_cut_command/ -tichý |strip-tagy

Nemôžem povedať, že je perfektný, ale aspoň je čitateľný v termináli.

Príklady sed s pracovnými postupmi: Príklad pracovného toku: bezpečne nahraďte všetky pomocou príkazov find, grep a sed

Je bezpečné povedať, že zmeny vykonané pomocou sed s možnosťou -i sú nevratné. To znamená, že pokiaľ si nie ste úplne istí, aký text má byť nahradený, pravdepodobne budete mať o jeden znak menej, ako bolo určené. Preto v tomto prípade použijeme sed v pracovnom toku na bezpečnú náhradu textu vo všetkých súboroch, ktoré ste vybrali.

Pracovný tok

  1. Nájsť
  2. uchopenie
  3. sed
Nájsť

Tu vyberiete súbory, ktoré sa majú nahradiť. Navrhujem použiť príkaz v tomto poradí:

Nájsť -typf-názov | uchopenie -v-A| xargs-ja ...

Môžete napríklad chcieť obmedziť súbory na nahradenie súborov PHP s výnimkou adresárov úložiska git nasledovne.

Nájsť -typf-názov*.php| uchopenie -v -A '. choď' | xargs -i...

Prečítajte si viac o príkaze xargs v bash.

uchopenie

Ďalej sa pokúsime priradiť some_pattern k súborom vybraným nasledovne. Všimnite si toho, že pretože pre grep používame voľbu -o, výstup zobrazí iba zodpovedajúci reťazec, ak existuje.

Nájsť -typf-názov*.php| uchopenie -v -A '. choď' |
xargs -i uchopenie -Asome_pattern-alebo

Vyššie uvedený príkaz by mal vrátiť zoznam reťazcov zodpovedajúcich some_pattern.

sed

Nakoniec chceme nahradiť všetky reťazce zodpovedajúce some_pattern. Aby sme to urobili, musíme grep previesť na sed nasledujúcim spôsobom.

Nájsť -typf-názov*.php| uchopenie -v -A '. choď' |
xargs -i sed -i -As/some_pattern/výmena/g

Príkaz grep sa zmení na sed -i a voľba -o sa odstráni. A tu to máte.

Teraz môžete namiesto testovania šťastia skontrolovať, aké struny budú v sedle nahradené.

Poznámky k možnostiam použitým v príkladoch

Tu je zoznam možností použitých v príkladoch sed, ktoré sme stručne prediskutovali.

Možnosť Popis
-i Upraviť na mieste. Ak je vstupom súbor (nie je zapojený), výsledok výrazov prepíše obsah súboru.

Sed jednu prijíma

napr) sed -n…

-A -e znamená výraz. Jeho parametrom je výraz v jazyku sed.

Sed mnohých prijíma

napr. sed -e'expr1 '-e'expr2'

-n Skryje čiaru, ktorá nie je ovplyvnená výrazom. To znamená, že ak je výraz tlačovým príkazom v jazyku sed, potom riadky, ktoré nie sú zahrnuté v tlačovom vyhlásení, nebudú zahrnuté do výstupu.

napr) sed -n…

Ďalšie informácie o dostupných možnostiach sed nájdete v sed –help

Ukončite poznámky k ekvivalentným príkazom použitým v príkladoch

Nasledujúce pomocné programy príkazového riadka sú súčasťou príkladov sed s ekvivalentnými príkazmi.

  • triediť
  • hlava
  • chvost
  • uchopenie
  • kat
  • NS
  • tričko

Poznámka na konci - v príklade ekvivalentné príkazy

V prípade, že vás zaujíma, čo sa v tomto prípade deje - -, je táto poznámka pre vás. Po väčšine príkazov v príkladoch som pridal znak -, aby naznačil, že očakávame, že vstup bude prijatý potrubím. To znamená,

katnejaký súbor| triediť -R-| hlava -1

Keď je však prítomný príkaz na ľavej strane potrubia, môžeme nápovedu vynechať nasledovne.

katnejaký súbor| triediť -R | hlava -1

To sa dialo s príkazmi - znak za príkazom v príkladoch.

Poznámky k funkciám nastavenia

V prípade, že hľadáte, tu sú funkcie nastavenia pre vyššie uvedené príklady. Výstup získaný pomocou deklarácie -f. Prečítajte si viac o príkaze deklarácie v bash, kde nájdete ďalšie použitia.

Príkazy

slová()
{
nasl 100
}
bar()
{
zahodil ---
}
old-php()
{
zahodil 'ereg ($ UA,' Bottybot ')'
}

Spodná čiara

Bavilo ma písať príklady Bash sed a dokonca som po ceste získal niekoľko ďalších trikov. Sed je mocný nástroj príkazového riadka a expresívny jazyk na manipuláciu s textovými súbormi. Ak sa vám páčilo učiť sa o sed, nebojte sa, že je toho ešte veľa, na čo sa musíte dotknúť. Sed na.