Jest kilka sposobów na obejście tego w / sed. Jednym ze sposobów jest opóźniony odczyt, zgodnie z zaleceniami przyjętej odpowiedzi. Można to również napisać w następujący sposób:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... z nieco wyraźnym spoglądaniem w przyszłość zamiast z tyłu zaimplementowanym gdzie indziej z buforem wstrzymania. Które będą mieć ten sam problem z ostatniej linii, która @don_crissti zauważa jednak, bo N robi przyrost cykl linii i rpolecenia EAD jest stosowany przez numer linii.
Możesz obejść to:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Nie wszystkie seds zinterpretują -standardowe wejście, ale wielu tak. ( POSIX mówi, że sed powinien obsługiwać -standard-in, jeśli implementator chce -oznaczać standard-in ???)
Innym sposobem jest uporządkowanie dołączonej zawartości w kolejności. Istnieje inne polecenie, które planuje wyjście w taki sam sposób, jak rrobi to ead, i sedzastosuje je i read w kolejności, w jakiej są skrypty. Jest jednak trochę bardziej zaangażowany - wymaga użycia jednego, sedaby adopasować Pointerdopasowanie do wyniku innego sedw swoim skrypcie.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Zasadniczo pierwszy sedpisze drugi sedskrypt, który drugi sedodczytuje na standardowym wejściu (może ...) i stosuje z kolei. Pierwszy seddziała tylko przy pierwszym dopasowaniu dla Pointerznalezionego, a następnie qwprowadza dane wejściowe. Jego zadaniem jest ...
s/[]^$&\./*[]/\\&/g;H
- Upewnij się, że wszystkie znaki wzorcowe są bezpiecznie odwrócone ukośnikiem, ponieważ drugi
sedbędzie musiał zinterpretować każdy fragment, który czyta dosłownie, aby go poprawnie. Gdy to zrobisz, umieść kopię w Hstarej przestrzeni.
s|.*|/&/!p;//!d|p; x
- Powiedz drugiemu,
sedaby pzrewidował każdą linię wprowadzania, !ale tę, /&/którą właśnie zabezpiecziliśmy; a następnie dusunąć to samo. pzrewiduj polecenia po drugim sed, a następnie xzmień hstary i bufor buforów wzorców, aby działały na naszej zapisanej kopii.
s|.|r file1&a\\&|p;q
- Jedynym char, z którym pracujemy tutaj, jest
\newline, ponieważ sedbędzie poprzedzał jeden, gdy staraliśmy się Ho linię wcześniej. Więc wstawiamy polecenie r file1i podążamy za nim z naszą \newline, a następnie polecenie a\\dla append, a następnie także \newline. Cała reszta naszej Hlinii eld jest zgodna z ostatnią \nlinią ewline.
Skrypt, który pierwszy pisze, wygląda mniej więcej tak:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Zasadniczo drugi sedwypisze każdą linię, ale ten pierwszy sedustawi ją na append. Dla tej konkretnej linii zaplanowano dwa opóźnione zapisy do standardowego wyjścia - pierwszy to ead, a drugi to kopia linii, którą chcemy po nim. Pierwsze doktorowanie nie jest nawet konieczne w tym przypadku (patrz? Żadnych odwrotnych ukośników), ale ważne jest, aby bezpiecznie uciec w sposób, w jaki tu robię, za każdym razem, gdy dopasowanie wzorca zostanie zmienione jako wejście.rfile1sed
W każdym razie, więc ... jest kilka sposobów.