sed

Příklady Bash Sed

Příklady Bash Sed
Bash vám umožňuje provádět výměnu vzorů pomocí variabilní expanze jako ($ var / pattern / replacement). A tak dělá sed takto (sed -e 's / pattern / replacement /'). Existuje však více než nahrazení vzorů v textových souborech.  Zde například znovuobjevíme sed 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 stručný průvodce pro nastavení příkladu, který se pokusím nedělat příliš přehnaně.

„Slova“ je textový soubor obsahující čísla 1 až 100. Pokud si nejste jisti vytvořením příkazu, přečtěte si část Funkce exportu pro xargs v příkazu Bash Export. Nikdy nevíte, že to může být při příštím rozhovoru se skriptem.

„Bar“ je textový soubor obsahující jeden řádek -.

„Old-php“ je textový soubor obsahující řádky starého PHP, které se zlomí v php7 nebo novějším. (Tip: ereg)

Všimněte si, ž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 najdete více než jedno řešení dané úlohy. Většinou však chcete jít cestou, která přináší nejmenší odpor. Zde je seznam příkladů sed příkazů s odpovídajícími ekvivalentními příkazy, kde některé budou podrobněji popsány níže.

1. Tisk náhodného řádku (ekvivalent třídění -R - | hlava -1)

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

2.Tisk posledního řádku v souboru (ekvivalent hlavy -1 -)

sed -n '$ p' -

3. Tisk prvních 10 řádků v souboru (ekvivalent head -n 10 -)

sed '10q' -

4. Tisk prvního řádku v souboru (ekvivalent ocasu -1 -)

sed -n '1p' -

5. Smažte všechny instance znaku (ekvivalentní tr -delete '0' -, kde 0 je znak, který chceme smazat)

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

6. Převést soubor csv na tsv (ekvivalentní tr ', "\ t' -)

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

7.Připojit řádek k souboru (ekvivalent k baru kočky -)

sed '$ a ---' -

8. Prepend line to file (ekvivalent cat - bar)

sed '1i ---' -

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

sed -n -e 'p' -

10. Tisk řádků odpovídajících vzoru (ekvivalent grep -e '^ 1' -)

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

11. Smazat řádky odpovídající vzoru (ekvivalent grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

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

sed -n -e '$ =' -

13. Zápis do souboru na pozadí (ekvivalentní příkazové tričko)

sed "w $ 1" -

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

Vpravo nahoře je příklad označený Zápis do souboru na pozadí. Nějaké zvuky jako povel odpaliště. No, to je. Zde budeme rozšiřovat, jak implementovat funkci, která nahradí tee v bash pomocí sed.

Příkazy

tričko ()

test $ # -eq 1 || vrátit se;
sed "w $ 1" -

hlavní ()

č. 10 | tričko deset;
kočka deset

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ý dostaneme od kočky souboru napsaného v tričku. 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 návod.

Implementujte funkci, která

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

Funkce očekává, že vstup bude směrován zvenčí.

Příkazy

some-line ()

funkce lc ()

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

sed -n -e "$ 1 p" -
;
teplota = $ (mktemp);
kočka -> $ temp;
kočka $ temp | print-line $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp

Příklad použití (1)

seq 100 | _

Výstup (1)

35

Příklad použití (2)

curl https: // linuxhint.com / bash_cut_command / --silent | proužkové štítky | nějaký řádek

V níže uvedeném příkladu je použití značky sed k odstranění značek HTML. Všimněte si, že nad příklad někdy vrací prázdné prázdné řádky. Cvičení lze vylepšit.

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

Předpokládejme, že chcete implementovat funkci v bash pro tisk daného řádku v souboru. Pokus o tisk jednoho řádku v souboru pomocí smyčky v bash, head, tail nebo awk je příliš mnoho práce na tisk řádků v souboru. Dobrá věc, máme sed. Výsledná funkce používající sed by byla následující.

Příkazy

print-line ()

sed -n "$ 1 p" -

Nyní se podívejme, co se stane, když použijeme tiskový řádek na slova.

Příkazy

slova | řádek tisku 50

Výstup

50

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

Příkazy

deklarovat -xf slova
deklarovat -xf print-line
seq 1 10 $ (slova | wc -l) | xargs -i bash -c "slova | print-line "

Výstup

1
11
21
31
41
51
61
71
81
91

dobře. Nyní se to více podobá! Uvidíte, jak může být sed použit v bash skriptu 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é přináší nejmenší odpor, sed způsob; jinak 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 v shellovém skriptu

sed -e 's / ^ / # /' -
Smazat první řádek
sed -e '1d' -
Smazat poslední řádek
sed -e '$ 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 tagy
sed -e '/<[^>] *.//G' -
Upgradujte ereg ve starém php kódu a spusťte jej v php7 nebo novějším
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Zkontrolujte, zda je sed starší než určitá verze
sed -e 'v 4.5 ' -

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

Nahoře v příkladech je řádek ke kontrole, zda je sed starší než určitá verze, kterou můžeme použít k implementaci větvení verzí v bash, což je podle mého názoru jednodušší než pokus o implementaci funkce pro porovnání čísel verzí z výstupu sed -version. Jedinou úskalí je, že pokud existuje starší verze sed, která nepodporuje příkaz v, pak máme potíže.

Příkazy

test-sed-version-at-most ()
echo -n | sed "v $ 1" - 2> / dev / null

vyzkoušená verze ()

echo -n "Verze $ 1. dobře. Udělejte to;
test-sed-version-at-most $ 1 &&
echo -n "starý";
skutečný
||
echo -n "nový"
;
způsob ozvěny."

hlavní ()

místní v;
pro v v 4.4,5;
dělat
vyzkoušená verze $ v;
Hotovo

hlavní

Výstup

Verze 4.4. dobře. Udělejte to starým způsobem.
Verze 4.5. dobře. Udělejte to novým způsobem.

Všimněte si, že verze sed běžící na mém počítači od psaní těchto znaků je 4.4, což by vysvětlovalo výstup výše. Současně byla nejnovější verze gnu sed 4.7, asi o 3 roky starší než ten, který 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é alespoň v4.0.6, což je shovívavé vzhledem k tomu, že tato verze byla vydána počátkem roku 2003. Jsi dobrý.

Udělal jsem nějaké další kopání, vlastně NOVINY čtení z nejnovějšího zdrojového kódu. Verze 4.6 má novou funkci, -debug, která vypíše skript a anotuje výstupní řádky. To vám umožní přeložit sed skripty generované funkcemi v bash do kanonické podoby. Chladný! Nezapomeňte, že potřebujete verzi sed větvení v bash. To je místo, kde tento příklad sed přichází do hry.

Příklad funkce bash používající sed k stripování značek HTML

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

Příkazy

strip-tagy ()

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

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tagy

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

Příklady sed s pracovními postupy: Příklad pracovního postupu: bezpečně je vyměňte pomocí find, grep a sed

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

Pracovní postup

  1. nalézt
  2. grep
  3. sed
nalézt

Zde vyberete soubory, které mají být nahrazeny. Navrhuji použít příkaz v těchto řádcích:

najít -typ f -název | grep -v -e | xargs -i…

Můžete například chtít omezit soubory tak, aby nahradily soubory PHP, kromě adresářů git repozitáře následujícím způsobem.

najít -typ f -název \ *.php | grep -v -e '.git '| xargs -i…

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

grep

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

najít -typ f -název \ *.php | grep -v -e '.git '|
xargs -i grep -e some_pattern -o

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.

najít -typ f -název \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / some_pattern / replacement / g

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

Nyní si můžete vyzkoušet, které řetězce budou nahrazeny v sedu, místo testování štěstí.

Vysvětlivky k možnostem použitým v příkladech

Zde je seznam možností použitých v krátce diskutovaných příkladech sed.

Volba Popis
-i Upravit na místě. Pokud je vstupem soubor (není vložen do kanálu), výsledek výrazů přepíše obsah souboru.

Sed jednoho přijímá

např. sed -n…

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

Sed přijímá mnoho

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

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

např. sed -n…

Další informace o dostupných možnostech sed naleznete v části sed -help

Ukončete poznámky o ekvivalentních příkazech použitých v příkladech

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

Endnote on the trailing - in example equivalent commands

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

kočka nějaký soubor | sort -R - | hlava -1

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

kočka nějaký soubor | sort -R | hlava -1

To se dělo se znakem - po příkazech v příkladech.

Poznámky k funkcím pro nastavení

Pokud hledáte, zde jsou funkce pro nastavení výše uvedených příkladů. Výstup získaný pomocí declare -f. Přečtěte si více o příkazu declare v bash pro další použití.

Příkazy

slova ()

seq 100

bar ()

echo ---

old-php ()

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

Sečteno a podtrženo

Líbilo se mi psát příklady Bash sed a dokonce jsem si během cesty vzal 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 jste se rádi učili o sedu, nebojte se, je toho ještě hodně, čeho se musíte dotknout. Sed na.

Hry Jak vyvíjet hru na Linuxu
Jak vyvíjet hru na Linuxu
Před deseti lety by jen málo uživatelů Linuxu předpovídalo, že jejich oblíbený operační systém bude jednoho dne populární herní platformou pro komerčn...
Hry Porty komerčních her s otevřeným zdrojovým kódem
Porty komerčních her s otevřeným zdrojovým kódem
Zdarma, s otevřeným zdrojovým kódem a multiplatformní herní enginy lze hrát staré i některé z poměrně nedávných herních titulů. Tento článek uvede sez...
Hry Nejlepší hry z příkazového řádku pro Linux
Nejlepší hry z příkazového řádku pro Linux
Příkazový řádek není při používání Linuxu jen vaším největším spojencem - může být také zdrojem zábavy, protože jej můžete použít k hraní mnoha zábavn...