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
12
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á
- Získá počet řádků v souboru, L
- Generuje náhodné číslo mezi 1 a L, R.
- 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)
35Příklad použití (2)
zvlnění https://linuxhint.com/bash_cut_command/ --tichý |páskové značky|nějaký řádekViz 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átkaVýstup
padesátkaDobře. Vypadá to dobře, ale zkusme něco, co vypadá trochu méně triviálně.
Příkazy
prohlásit -xfslovaprohlásit -xftisková linka
následující 1 10$(slova| toaleta -ten ) | xargs-ibash -C 'slova | tiskový řádek {} '
Výstup
1jedená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
- nalézt
- rukojeť
- 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 -1Když 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 -1To 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.