Chvíli jsem tedy používal ‚sed‘ na linuxu, ale měl jsem trochu potíže s jeho používáním na OSX, protože ‚POSIX sed‘ a ‚GNU sed‘ mají tolik malých rozdílů. Momentálně se potýkám s tím, jak vložit řádek textu za určité číslo řádku. (v tomto případě řádek 4)
Na linuxu bych udělal něco takového:
sed --in-place "4 a\ mode '0755'" file.txt
Takže na OSX jsem zkusil toto:
sed -i "" "4 a\ mode '0755'" file.txt
To mi však stále zobrazuje chybu „nadbytečné znaky po \ na konci příkazu“. Nějaké nápady, co je tady špatně? mám překlep? Nebo nerozumím dalšímu rozdílu mezi verzemi sed?
Přijatá odpověď:
Přesně řečeno, specifikace POSIX pro sed vyžaduje nový řádek za a\ :
[1addr]a\ textNapište text na standardní výstup, jak bylo popsáno výše.
Díky tomu je psaní jednoduchých řádků trochu nepříjemné, což je pravděpodobně důvod pro následující rozšíření GNU do a , i a c příkazy:
Jako rozšíření GNU, pokud je mezi
aa nový řádek je jiný než mezera-\sekvence, pak text tohoto řádku, počínaje prvním znakem bez mezery zaa, se bere jako první řádek textu blok. (To umožňuje zjednodušení skriptování jednořádkového přidání.) Toto rozšíření také funguje siacpříkazy.
Tedy, aby byl přenosný s vaším sed syntaxi, budete muset za a\ vložit nový řádek Nějak. Nejjednodušší způsob je vložit nový řádek v uvozovkách:
$ sed -e 'a\
> text'
(kde $ a > jsou výzvy shellu). Pokud zjistíte, že to bolí, bash [1] má $' ' citace syntaxe pro vkládání escape stylu C, takže stačí použít
sed -e 'a\'$'\n''text'
[1] a mksh (r39b+) a některé non-bash bourne shelly (např. /bin/sh ve FreeBSD 9+)