Zachowanie narzędzi powłoki różni się nieznacznie między wariantami unixa. Istnieje wiele wariantów uniksowych o złożonej historii . Podejmowane są działania normalizacyjne, takie jak standard POSIX i jego nadzbiór nad specyfikacją Single UNIX . Obecnie większość systemów implementuje POSIX: 2001, znany również jako specyfikacja Single UNIX wersja 3 , z niewielkimi odchyleniami i wieloma rozszerzeniami. Specyfikacja Single Unix nie jest samouczkiem, ale wersja 3 jest czytelna, jeśli już wiesz, co robi polecenie. Możesz skonsultować się z nim, aby dowiedzieć się, czy jakaś funkcja jest standardem czy rozszerzeniem określonego systemu.
Większość użytkowników Uniksa używa Linuksa i nie użyła żadnego innego wariantu. Linux jest dostarczany z narzędziami GNU , które często mają wiele rozszerzeń standardu. Znajdziesz więc sporo kodu, który działa na Linuksie, ale nie na innych unikach, ponieważ opiera się na tych rozszerzeniach.
Jeśli chodzi o sed, zapoznaj się ze specyfikacją sed Single Unix, aby poznać minimum, które powinien obsługiwać każdy system, stronę podręcznika systemowego, która obsługuje implementację, oraz instrukcję GNU sed, z której korzysta większość osób.
Jedno z niestandardowych rozszerzeń GNU sed obsługuje wiele poleceń uruchamianych razem. Na przykład ten program GNU sed wypisuje wszystkie linie zawierające a
, ale zmienia się b
w c
pierwszy:
sed -ne '/a/ {s/b/c/g; p}'
{
i }
tak naprawdę są osobnymi poleceniami, więc dla pełnej przenośności musisz je określić albo w osobnych wierszach (w pliku), albo w osobnych -e
argumentach (w wierszu poleceń). Brak separatora poleceń po {
i użycie ;
jako separatora poleceń są powszechnymi rozszerzeniami. Brak separatora poleceń wcześniej }
jest rzadszym rozszerzeniem. Jest to zgodne ze standardami:
sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'
Jest to niestandardowe, ale powszechnie akceptowane:
sed -ne '/a/ { s/b/c/g; p; }'
Innym niestandardowym, ale powszechnym rozszerzeniem jest użycie \n
znaku nowej linii w s
tekście zastępczym (użycie wyrażenia regularnego jest standardowe). Przenośną metodą jest uwzględnienie odwrotnego ukośnika w skrypcie sed. Innym powszechnym rozszerzeniem jest \+
, \?
a \|
wyrażenia regularne oznacza jedno lub więcej, co najwyżej jedno i na przemian; w przenośnych podstawowych wyrażeniach regularnych nie ma żadnego z nich. Na przykład pierwsze polecenie jest nieprzenośnym sposobem zastępowania ciągłych sekwencji białych znaków nową linią; drugie polecenie jest odpowiednikiem zgodnym ze standardami.
sed -e 's/ \+/\n/'
sed -e 's/ */\
/'
sed
Sam GNU jest zgodny, ponieważ pozwala na rzeczy dozwolone (ale nie wymagane, nieokreślone) przez standard. Są przypadki, w których jest niezgodny i gdziePOSIXLY_CORRECT
może pomóc uruchomienie go w środowisku. Podobnie jak w przypadkus/[\n]//g
tego, należy usunąć luz in
znaki, ale zamiast tego usunąć nowe linie. Lub zachowanieN
polecenia w ostatnim wierszu.sed -ne '/a/ { s/b/c/g; p; }'
jest standardem od wydania normy 2016. Zawsze był przenośny. Zobacz austingroupbugs.net/view.php?id=944&nbn=7OS X jest obecnie wyposażony w wersję FreeBSD sed z 2005 roku. Większość poniższych różnic dotyczy także innych wersji BSD sed.
Zastosowania sed OS X dla zastosowań
-E
ERE i GNU sed-r
.-E
to alias dla-r
GNU sed (dodany w 4.2, nieudokumentowany do 4.3). Nowsze wersje FreeBSD i NetBSD sed obsługują zarówno-E
i-r
. OpenBSD sed obsługuje tylko-E
.-i ''
działa z sed OS X, ale nie z GNU sed.-i
współpracuje z GNU sed, najnowszymi wersjami NetBSD, OpenBSDsed
, ale nie sed OS X.-i -e
współpracuje z obydwoma, ale w przypadku FreeBSDsed
wykonuje kopię zapasową oryginalnego pliku z-e
dopisaniem do nazwy pliku (i musisz przekazać nie więcej niż jedno wyrażeniesed
).GNU sed interpretuje sekwencje, takie jak
\t
,\n
,\001
,\x01
,\w
, i\b
. Sed OS X i POSIX sed interpretują tylko\n
(ale nie w części zamiennejs
).GNU sed interpretuje
\|
,\+
oraz\?
w BRE ale sed i POSIX sed OS X za nie.\(
,\)
,\{
, I\}
są POSIX BRE.GNU sed pozwala na pomijanie
;
lub nową linię wcześniej,}
ale sed OS X nie.i
(wstaw),a
(dołącz) ic
(zmień) muszą być poprzedzone odwrotnym ukośnikiem i nową linią w sed OS X i POSIX sed, ale nie w GNU sed. Sed GNU dodaje brakujący przełamane po tekście włożonej przezi
,a
lubc
ale OS X sed nie. Na przykładsed 1ia
jest GNU alternatywą dlased $'1i\\\na\n'
.Na przykład
printf a|sed -n p
dodaje nową linię w sed OS X, ale nie w GNU sed.Sed OS X nie obsługuje modyfikatorów
I
(bez uwzględniania wielkości liter) aniM
(wielu linii). Nowsze wersje wsparcia dla FreeBSD sedI
.Sed OS X nie obsługuje
-s
(--separate
),-u
(--unbuffered
) ani-z
(--null-data
).Jedną z opcji BSD, która nie jest obsługiwana przez GNU sed
-a
, jestw
dodanie pliku do pliku zamiast obcięcia go.Przykłady poleceń GNU sed, które nie działają z sed OS X:
źródło
-i -e
nie działa na OSX. Interetuje-e
jako przyrostek.-i
zawsze wymaga sufiksu, nawet jeśli pusty ciąg. tak-i '' -e
powinno działać.-i -e
działa z oboma”. w twojej odpowiedzi sugeruje, że istnieje rozwiązanie wieloplatformowe. Najwyraźniej nie ma.Najlepszym sposobem, w jaki znalazłem taką samą pracę skryptów w systemach Linux i Mac jest:
źródło
perl
skąd-i
pochodzi.perl -Tpi -e 's/foo/bar/' -- "$TARGET"