W tej edycji
Stéphane Chazelas POSIXify (ponownie) moje sed
formatowanie poprzez wstawienie -e
przerwy xpression i innej -e
instrukcji xpression. Teraz mogę go zapytać, dlaczego w komentarzach, ale przypuszczam, że jest to już numer 18 tej odpowiedzi i prawie wszystkie poprzednie były już dzięki podobnym gratisom (jeśli zobaczysz usunięte komentarze, będziesz wiedział, co Mam na myśli) . Myślę też, że jestem wystarczająco blisko, aby zrozumieć, dlaczego sformułować to w sposób, który może być bardziej ogólnie przydatny. Mam nadzieję, że ...
Generalnie wolę zachować moje całkowite sed
-e
xpressions do jednego, jeśli mogę, ale mam też większą ochotę na dostosowanie się do specyfikacji tak blisko, jak to możliwe, szczególnie gdy różnica wynosi nie więcej niż a <space>
i an -e
. Ale nie mogę tego zrobić, jeśli nie rozumiem, dlaczego powinienem. Oto krótkie podsumowanie obecnego stanu mojego zrozumienia:
' -e '
przerwa może przenośnie stanąć nased
skrypt\n
przerwie ewline wsed
oświadczeniu wiersza polecenia ... Jestem wprawdzie rozmyta, dlaczegonawias zamykający w
sed
{
funkcji}
musi być poprzedzony\n
przerwaniem ewline, jak podano tutaj:- Znak
<right-brace>
poprzedzony jest znakiem<newline>
a i może poprzedzać go lub następować po nim<blank>
znak.
- Znak
\n
przerwa ewline podobnie jest wymagane po każdym wykorzystaniu ...a
,b
,c
,i
,r
,t
,w
, lub:
.
Ale nie rozumiem jasno, w jaki sposób definicja {
funkcji }
odnosi się do !
operatora niebędącego operatorem. Jedyna wzmianka o operatorze negacji znajdująca się w specyfikacji:
- Funkcja może być poprzedzona jednym lub większą liczbą
!
znaków, w którym to przypadku funkcja zostanie zastosowana, jeśli adresy nie wybiorą przestrzeni wzorów.
Czy oznacza to, że stosowanie dokumentu !
zakłada {
szelki }
? Co z $!
poleceniami - czy powinny być one również oddzielone ' -e '
przerwami? Czy o to chodziło, kiedy Stéphane POSIXifikował ostatnio moją odpowiedź?
Myślę, że jest to albo !
operator negacji, albo b
wypowiedź rancza, do której odnosi się w swojej edycji - a może jest to jednocześnie naraz - ale nie wiem i chciałbym to zrobić. Jeśli jest to tylkob
oświadczenie ranczo, to wierzęd
zrobiłby na jego miejscu i wyeliminować potrzebę ' -e '
przerwie, ale wolałbym być pewny zanim hazarding trzykroć POSIXified odpowiedź. Możesz pomóc?
Zrobiłem ryzykować po wszystkim , ale nie z każdej wielkiej pewności ...
:
że jechałeś do domu kilka miesięcy temu. Ale nie do końca rozumiem, dlaczego drugie sed
polecenie było podobnie POSIXified .
sed
jest dla mnie bardzo niejasna. W przeszłości kilkakrotnie prosiłem o wyjaśnienia, ale nie sądzę, aby w rezultacie został zaktualizowany. Dobrym testem jest wypróbowanie zestawu narzędzi dla potomków (Solaris, wywodzący się z oryginału, na którym w dużej mierze oparta jest specyfikacja POSIX).
s///
utstitutions są w stanie zaakceptować tworzenie łańcuchów za pomocą ; . rozmywa się wokół poleceń, które muszą być oddzielone znakiem nowej linii, i jak -e
może stać w tym przypadku - przynajmniej dla mnie. natknąłem się jednak na coś, sed
co nie interpretuje ich dość zamiennie.
;
przed nową linią - nowa linia jest w porządku. Szczerze mówiąc, to mógłby zrobić bez -e
i wszystko całkowicie i po prostu zapisać plik, jak #!/bin/sed
z każdego polecenia na nową linią - lub te, które nie wymagają takich ograniczników zamiast rozdzielone ;
. Te, które zrobić wymagają nowej linii są zwykle te, które przyjmują dowolne wejście - :
nazwy etykiet i poleceń, które odnoszą się do nich jak b
lub t
czy zamykanie }
nawiasów klamrowych dla funkcji lub r
EAD i w
obrzędu, które biorą args nazwy pliku. Wszystkie muszą być przenośne \n
.
b;n;:b
rozgałęziasz się do etykiety o nazwie";n;:b"
seds historycznej i POSIX (a GNU sed nie jest pod tym względem).