$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
Powyższe sed
polecenie zastępuje nowy znak wiersza ciągiem „ciąg”. Ale nie znam znaczenia :a;$!N;s/\n/string/;ta
pojedynczych cytatów. Znam środkową część s/\n/string/
. Ale nie znam funkcji pierwszej ( :a;$!N;
) i ostatniej ( ta
) części.
sed
text-processing
Avinash Raj
źródło
źródło
Odpowiedzi:
Są to, co prawda, tajemnicze
sed
polecenia. W szczególności (zman sed
):Tak więc skrypt, który opublikowałeś, można podzielić na (dodane spacje dla czytelności):
Zasadniczo to, co to robi, można zapisać w pseudokodzie jako
Możesz to zrozumieć nieco lepiej dzięki bardziej złożonemu przykładowi wprowadzania:
Nie jestem do końca pewien, dlaczego
!$
jest to potrzebne. O ile mogę stwierdzić, możesz uzyskać tę samą moc wyjściowąźródło
$!
nie!$
. Jednak może być!N
i nie$!
.!N
lub$!
. Tak więc nadal myślę, że to, czy ostatnia linia to nowa linia, czy EOF.$!
„zasięgu” adresu z operatorem dopełniania Postfiksa - więc$!N
(rób toN
wszędzie oprócz adresu$
) jest tak naprawdę taką samą składnią jak coś podobnegom,n!d
(usuwaj wszystko oprócz wierszym
don
).:
jest analogiem dogoto
etykiety i faktycznie:
był goto label w skorupie Thompsona, więc byłoby znane ludziom w ciągu dnia za pomocą zarówno sed, jak i powłoki ThompsonJa po tej odpowiedzi, ponieważ widzę sporo zamieszania na temat , dlaczego ostatnia linia jest wyłączona podczas wykonywania
N
(poprzez adresowania ciąg linii$!
) i dlatego, że PO zmieszał o znaczeniu:a;$!N;
w a sed polecenia , nie tylko w tym jednym konkretnym on pisał .Cóż, korzyść z używania
$!N
zamiastN
nie jest oczywista w proponowanych przykładach (przez OP i @terdon), ponieważ w ostatnim wierszu po poleceniu nie jest wykonywane polecenie „ważne” (kontynuuj czytanie)N
. (Rzeczywiście, wynik jest taki sam, jeśli ktoś usunie ten adres linii.)W bardziej złożonym przykładzie (na przykład zamień
this sentence
w pliku, gdzie dwa słowa pojawiają się czasami w jednej linii, a innym razem w dwóch liniach), wykluczenie ostatniego wierszaN
polecenia może być kluczowe! Jeśli ostatni wiersz nie jest wykluczony, po wykonaniuN
na nimsed
uderzaEOF
i kończy natychmiast, uniemożliwiając wykonanie wszystkich kolejnych poleceń (także poleceń rozgałęziających, a mianowiciet
ib
).W pokazanych zbyt uproszczonych przykładach możemy bezpiecznie usunąć
$!
i pozwolić nased
niepowodzenie wykonaniaN
i powrotu, ponieważ przerwanes
polecenie nie zrobiłoby nic, gdyby zostało wykonane, ponieważ nie można\n
go dopasować.źródło