Příklady Bash Sed

Bash Sed Examples



Bash vám umožňuje provádět náhradu vzoru pomocí variabilního rozšíření, jako je ($ {var/pattern/replacement}). A stejně tak sed takhle (sed -e ‘s/vzor/nahrazení/‘). V textových souborech je však více než sedět vzory. Zde znovu objevíme sed, například s ekvivalentními příkazy a pracovními postupy, které nám pomohou při každodenních úkolech.

Nastavení pro příklady sed

Zde je rychlý průvodce nastavením příkladu, který se pokusím nevytvářet příliš přehnaně.







slovaje textový soubor obsahující čísla 1 až 100. Pokud si nejste jisti příkazem k jeho vytvoření, přečtěte si téma Funkce exportu pro xargs v příkazu Bash Export. Nikdy nevíte, že to může být při vašem dalším skriptovacím rozhovoru.



barje textový soubor obsahující jeden řádek -.



starý phpje textový soubor obsahující řádky starého PHP, které se zlomí v php7 nebo novějším. (Nápověda: ereg)





Všimněte si toho, že všechny výše popsané funkce najdete níže v Endnote o funkcích pro nastavení.

Sed příklady s ekvivalentními příkazy

V prostředí příkazového řádku zjistíte, že pro daný úkol existuje více než jedno řešení. Z velké části však chcete jít cestou, která klade nejmenší odpor. Zde je seznam příkladů příkazů sed s odpovídajícími ekvivalentními příkazy, kde některé budou podrobně popsány níže.



1. Vytiskněte náhodný řádek (ekvivalent k řazení -R -| hlava -1)

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

2. Vytiskněte poslední řádek v souboru (ekvivalent hlavy -1 -)

sed -n '$ p'-

3. Vytiskněte prvních 10 řádků v souboru (ekvivalent hlavy -n 10 -)

sed '10q'-

4. Vytiskněte první řádek v souboru (ekvivalent ocasu -1 -)

sed -n '1p'-

5. Odstraňte všechny instance znaku (ekvivalent tr –delete ‘0’ -, kde 0 je znak, který chceme odstranit)

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

6. Převeďte soubor csv na tsv (ekvivalent tr ‘,‘ ‘ t‘ -)

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

7. Přidejte řádek do souboru (ekvivalent k Cat Bar -)

sed '$ a ---'-

8. Předřadit řádek do souboru (ekvivalent k baru - lišta)

sed '1i ---'-

9. Vytiskněte všechny řádky v souboru (ekvivalent k cat -)

sed -n -A 'p'-

10. Vytiskněte řádky odpovídající vzoru (ekvivalent grep -e ‘^1‘ -)

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

11. Odstraňte řádky odpovídající vzoru (ekvivalent grep -v -e ‘^1‘ -)

sed -A '/^1/ d'-

12. Získejte počet řádků v souboru (ekvivalent wc -l -)

sed -n -A '$ ='-

13. Zapisujte do souboru na pozadí (ekvivalent příkazu tee)

sed 'v$ {1}'-

Příklad použití sed k implementaci příkazu tee

Hned nahoře je příklad označený jako Zápis do souboru na pozadí. Zní to jako příkaz tee. No to je. Zde se budeme zabývat tím, jak implementovat funkci nahradit tee v bash pomocí sed.

Příkazy

tričko ()
{
test $ {#} -ekv 1 || vrátit se;
sed 'v$ {1}'-
}
hlavní()
tričkotento;
kočkatento

hlavní

Výstup

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

Zde uvidíte dva výpisy celých čísel od 1 do 10. První je z příkazu seq. Druhý získáme od kočky souboru napsaného v odpališti. Vím, že je to směšné, ale funguje to!

Příklad použití sed k vytištění náhodného řádku v souboru

Předpokládejme, že chceme vytisknout náhodný řádek v souboru pomocí bash a trochu sed. Můžeme to udělat? Ano, můžeme! Zde je postup.

Implementujte funkci, která

  1. Získá počet řádků v souboru, L
  2. Generuje náhodné číslo mezi 1 a L, R.
  3. Tiskne R.

Funkce očekává, že vstup bude napojen zvenčí.

Příkazy

nějaký řádek()
{
funkcelc()
{
sed -n -A '$ ='-
};
funkcetisková linka()
{
sed -n -A '$ {1}p '-
};
tepl= $( mktemp );
kočka-> $ {temp};
kočka $ {temp} |tiskový řádek $((NÁHODNÝ%$( kočka $ {temp} |lc)+1 ));
rm $ {temp}
}

Příklad použití (1)

následující 100 |_

Výstup (1)

35

Příklad použití (2)

zvlnění https://linuxhint.com/bash_cut_command/ --tichý |páskové značky|nějaký řádek

Viz níže uvedený příklad, pomocí sed k odstranění značek HTML. Všimněte si toho, že přes příklad někdy vrací prázdné řádky. Jako cvičení se to dá zlepšit.

Použití sed k tisku řádků v souboru

Předpokládejme, že chcete v bash implementovat funkci k vytištění daného řádku v souboru. Pokoušet se vytisknout jeden řádek v souboru pomocí smyčky v bash, head, tail nebo awk je příliš mnoho práce pro tisk řádků v souboru. Dobře, že máme sed. Výsledná funkce pomocí sed by byla následující.

Příkazy

tisková linka()
{
sed -n '$ {1}p '-
}

Nyní se podívejme, co se stane, když na slova použijeme print-line.

Příkazy

slova|tisková linkapadesátka

Výstup

padesátka

Dobře. Vypadá to dobře, ale zkusme něco, co vypadá trochu méně triviálně.

Příkazy

prohlásit -xfslova
prohlásit -xftisková linka
následující 1 10$(slova| toaleta -ten ) | xargs-ibash -C 'slova | tiskový řádek {} '

Výstup

1
jedenáct
dvacet jedna
31
41
51
61
71
81
91

Dobře. Nyní je to více podobné! Vidíte, jak lze sed ve skriptu bash použít k vytištění libovolného řádku v souboru.

Sed příklady bez ekvivalentních příkazů

V prostředí příkazového řádku je někdy cesta k řešení, které vyvolává nejmenší odpor, sed způsob; v opačném případě nakonec uděláte více práce, než je požadováno. Některé příkazy mohou být uvedeny níže.

Ovládejte všechny řádky ve skriptu shellu

sed -A 's/^/#/'-
Odstranit první řádek
sed -A '1d'-
Vymazatposledníčára
sed -A '$ d'-
Vložte řádek před řádky odpovídající vzoru
sed '/0 $/i ---'-
Vložte řádek za řádky odpovídající vzoru
sed ' / 0 $ / ---'-
Odstraňte html značky
sed -A 's /antine*.// g'-
Upgradujte eregvstarý php kód ke spuštěnívphp7 nebo novější
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Šek-li sedje starší než určitá verze
sed -A 'v 4.5'-

Příklad rozvětvení verze sed v bash

Nahoře v příkladech je řádek pro kontrolu, zda je sed starší než určitá verze, kterou můžeme použít k implementaci větvení verzí v bash, což je podle mě snazší, než se snažit implementovat funkci pro porovnávání čísel verzí z výstupu sed –version . Jediným úskalím je, že pokud existuje dřívější verze sed, která nepodporuje příkaz v, pak máme potíže.

Příkazy

test-sed-verze-nanejvýš() {
vyhodil -n | sed 'proti$ {1}'-2> /dev/nula
}
zkusit verzi()
{
vyhodil -n 'Verze$ {1}. Dobře. Udělej to ';
test-sed-verze-nanejvýš$ {1} && {
vyhodil -n 'starý';
skutečný
} || {
vyhodil -n 'Nový'
};
vyhodil ' způsob.'
}
hlavní()
{
místníproti;
proprotiv 4.{4,5};
dělat
zkusit verzi$ {v};
Hotovo
}
hlavní

Výstup

Verze4.4. Dobře. Udělejte to starým způsobem.
Verze4.5. Dobře. Udělejte to novým způsobem.

Všimněte si toho, že verze sed běžící na mém počítači při psaní těchto znaků je 4.4, což by vysvětlovalo výše uvedený výstup. Současně byla nejnovější verze gnu sed 4,7, asi o 3 roky starší než ta, kterou mám. Můj sed je starý! Ve skutečnosti v sed 4.0.6 byl do příkazu verze přidán parametr, takže tato strategie funguje pro všechny uvedené verze alespoň v4.0.6, což je shovívavé vzhledem k tomu, že verze byla vydána na začátku roku 2003. Jste dobří.

Provedl jsem nějaké extra kopání, vlastně NOVINKY, které jsem četl z nejnovějšího zdrojového kódu. Verze 4.6 má novou funkci –debug, která ukládá skript a anotuje výstupní řádky. To by vám umožnilo přeložit sed skripty generované funkcemi v bash do kanonické formy. Chladný! Nezapomeňte, že v bash potřebujete větvení sed verze. To je místo, kde tento sed příklad přichází do hry.

Příklad funkce bash pomocí sed k odstranění HTML tagů

Ve výše uvedených příkladech je řádek pro odstranění značek HTML. Vrhněme to do funkce bash a použijte ji k odstranění všech značek HTML z posledního článku, který jsem napsal.

Příkazy

páskové značky()
{
sed -A 's /antine*.// g'-
}
zvlnění https://linuxhint.com/bash_cut_command/ --tichý |páskové značky

Nemohu říci, že je perfektní, ale alespoň je čitelný v terminálu.

Příklady sed s pracovními toky: Příklad pracovního postupu: bezpečně nahraďte všechny pomocí find, grep a sed

Lze s jistotou říci, že změny provedené pomocí sed s volbou -i jsou nevratné. To je, pokud si nejste úplně jisti, jaký text má být nahrazen, pravděpodobně skončíte o jeden znak méně, než bylo zamýšleno. Proto v tomto příkladu použijeme sed v pracovním postupu k bezpečnému nahrazení textu ve všech souborech, které jste vybrali.

Pracovní postup

  1. nalézt
  2. rukojeť
  3. sed
nalézt

Zde vyberete soubory, které mají být nahrazeny. Doporučuji použít příkaz podle těchto řádků:

nalézt -typF-název | rukojeť -proti-A| xargs-já ...

Můžete například chtít omezit soubory tak, aby nahradily soubory PHP s výjimkou adresářů úložiště git, následujícím způsobem.

nalézt -typF-název*.php| rukojeť -proti -A '.jít' | xargs -i...

Přečtěte si více o příkazu xargs v bash.

rukojeť

Dále se pokusíme spojit some_pattern se soubory vybranými následujícím způsobem. Všimněte si toho, že protože pro grep používáme volbu -o, výstup zobrazí pouze odpovídající řetězec, pokud existuje.

nalézt -typF-název*.php| rukojeť -proti -A '.jít' |
xargs -i rukojeť -Asome_pattern-nebo

Výše uvedený příkaz by měl vrátit seznam řetězců odpovídajících some_pattern.

sed

Nakonec chceme nahradit všechny řetězce odpovídající some_pattern. K tomu musíme převést grep na sed následujícím způsobem.

nalézt -typF-název*.php| rukojeť -proti -A '.jít' |
xargs -i sed -i -As/some_pattern/výměna, nahrazení/G

Příkaz grep se změní na sed -i a volba -o se odstraní. A tady to máte.

Nyní můžete místo testování štěstí zkontrolovat, jaké struny budou nahrazeny v sed.

Koncové poznámky k možnostem použitým v příkladech

Zde je seznam možností použitých v příkladech sed, o kterých jsme se krátce zmínili.

Volba Popis
-i Upravit na místě. Pokud je vstupem soubor (není připojen), výsledek výrazů přepíše obsah souboru.

Sed jednoho přijímá

např. sed -n…

-A -e znamená výraz. Jeho parametrem je výraz v jazyce sed.

Sed mnohé přijímá

např. sed -e'expr1 '-e'expr2'

-n Skrývá čáru, která není výrazem ovlivněna. To znamená, že pokud je výraz tiskovým příkazem v jazyce sed, pak řádky, které nejsou zahrnuty v tiskovém prohlášení, nebudou zahrnuty do výstupu.

např. sed -n…

Další informace o dostupných možnostech sed naleznete v tématu sed –help

Ukončete poznámky k ekvivalentním příkazům použitým v příkladech

Následující nástroje příkazového řádku jsou zahrnuty v příkladech sed s ekvivalentními příkazy.

  • třídit
  • hlava
  • ocas
  • rukojeť
  • kočka
  • NS
  • tričko

Poznámka na konci - v příkladu ekvivalentní příkazy

Pokud vás zajímá, co se v tomto příkladu děje - znak, tato poznámka je pro vás. Po většině příkazů v příkladech jsem přidal znak -, aby naznačil, že očekáváme, že vstup bude přijat potrubím. To znamená,

kočkanějaký soubor| třídit -R-| hlava -1

Když je však příkaz na levé straně potrubí přítomen, můžeme nápovědu vynechat následovně.

kočkanějaký soubor| třídit -R | hlava -1

To se v příkladech dělo s příkazem - znak za.

Poznámky k funkcím pro nastavení

V případě, že hledáte, zde jsou funkce pro nastavení pro výše uvedené příklady. Výstup získaný pomocí declare -f. Další použití najdete v příkazu deklarace v bashu.

Příkazy

slova()
{
následující 100
}
bar()
{
vyhodil ---
}
starý php()
{
vyhodil 'ereg ($ UA,' Bottybot ')'
}

Sečteno a podtrženo

Bavilo mě psát příklady Bash sed a dokonce jsem po cestě nabral pár dalších triků. Sed je výkonný nástroj příkazového řádku a expresivní jazyk pro manipulaci s textovými soubory. Pokud se vám líbilo učit se o sed, nebojte se, je toho ještě mnoho, čeho se musíte dotknout. Sed na.