GNU/Linux >> Znalost Linux >  >> Linux

Rozdíly mezi Sed na Mac Osx a dalšími „standardními“ Sedmi?

Mám nějaké problémy s použitím odpovědi uvedené na tomto webu na tuto otázku o příkazu sed, který má nahradit prázdný řádek dvěma jinými řádky obsahu, a bylo vyvoláno, pokud příkaz sed v systému Mac OS (pro mě 10.6.7 ) je jiný. Nemyslím si, že tomu tak je, ale zajímalo by mě, jestli to ostatní na tomto webu myslí jinak.

Přijatá odpověď:

Chování obslužných programů prostředí se mezi unixovými variantami nepatrně liší. Existuje mnoho unixových variant se složitou historií. Existují standardizační snahy, jako je standard POSIX a jeho nadmnožina specifikace Single UNIX. Většina systémů dnes implementuje POSIX:2001, také známý jako Single UNIX Specification verze 3, s malými odchylkami a mnoha rozšířeními. Specifikace Single Unix není návod, ale verze 3 je čitelná, pokud již máte představu o tom, co příkaz dělá. Můžete se do něj podívat, abyste věděli, zda je některá funkce standardní nebo rozšíření konkrétního systému.

Většina uživatelů unixu používá Linux a nepoužili žádnou jinou variantu. Linux přichází s nástroji GNU, které mají často mnoho rozšíření standardu. Takže tam najdete poměrně hodně kódu, který funguje na Linuxu, ale ne na jiných unicích, protože se spoléhá na tato rozšíření.

Pokud jde o sed, prostudujte si specifikaci sed Single Unix pro minimum, které má každý systém podporovat, manuálovou stránku vašeho systému pro to, co vaše implementace podporuje, a příručku GNU sed pro to, co používá většina lidí.

Jedno z nestandardních rozšíření v GNU sed podporuje více příkazů spouštěných společně. Například tento program GNU sed vytiskne všechny řádky obsahující a , ale změní b do c první:

sed -ne '/a/ {s/b/c/g; p}'

{ a } jsou ve skutečnosti samostatné příkazy, takže pro plnou přenositelnost je musíte zadat buď na samostatných řádcích (v souboru) nebo v samostatném -e argumenty (na příkazovém řádku). Chybějící oddělovač příkazů za { a použití ; jako oddělovač příkazů jsou běžná rozšíření. Chybějící oddělovač příkazů před } je méně obvyklé rozšíření. Toto je v souladu se standardy:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Toto je nestandardní, ale běžně přijímané:

sed -ne '/a/ { s/b/c/g; p; }'

Dalším nestandardním, ale běžným rozšířením je použití \n znamená nový řádek v s náhradní text (použití v regulárním výrazu je standardní). Přenosnou metodou je zahrnout zpětné lomítko-nový řádek do skriptu sed. Další běžnou příponou je \+ , \? a \| v regulárních výrazech znamená jeden nebo více, maximálně jeden a střídání; přenosné základní regulární výrazy nemají nic z toho. Například první příkaz je nepřenosný způsob nahrazení souvislých sekvencí bílých znaků novým řádkem; druhý příkaz je ekvivalentem vyhovujícím standardům.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

Linux
  1. Vysvětlení rozdílů mezi textovými editory Vi a Vim

  2. Rozdíl mezi ‚A‘ na příkazovém řádku (bash)??

  3. Rozdíly mezi svazkem, oddílem a diskem?

  1. Jak sdílet soubory mezi Ubuntu a Mac OS X

  2. Rozdíl mezi '{}' a {} v příkazu find?

  3. Rozdíl mezi cp -r a cp -R (příkaz kopírování)

  1. Příkaz Linux Sed:Použití a příklady

  2. Rozdíl mezi potrubím a rozšířením příkazů?

  3. Rozdíly mezi hardwarovými a softwarovými firewally