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\ text
Napiš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
a
a 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 si
ac
pří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+)