Trzy różne sedpolecenia:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Wszystkie trzy opierają się na podstawowym s///poleceniu dotyczącym upodstytucji:
s/"[^"]*"\n<[^>]*>/other characters /
Wszyscy oni również starają się zachować ostrożność w obsłudze ostatniego wiersza, ponieważ sedzwykle różnią się wydajnością w przypadku krawędzi. To jest znaczenie $!adresu odpowiadającego każdej linii, która !nie jest $ostatnia.
Wszyscy oni również używają Npolecenia ext, aby dołączyć następny wiersz wejściowy do przestrzeni wzorów po \nznaku ewline. Każdy, kto sedprzez jakiś czas \ngrał, nauczy się polegać na postaci ewline - ponieważ jedynym sposobem na zdobycie takiego jest wyraźne umieszczenie go tam.
Wszystkie trzy podejmują próbę odczytania jak najmniejszej ilości danych wejściowych przed podjęciem działania - seddziałają tak szybko, jak to możliwe i nie muszą czytać całego pliku wejściowego przed wykonaniem tej czynności.
Chociaż robią wszystko N, wszystkie trzy różnią się metodami rekurencji.
Pierwsze polecenie
Pierwsze polecenie wykorzystuje bardzo prostą N;P;Dpętlę. Te trzy polecenia są wbudowane w dowolny kompatybilny z POSIX sedi ładnie się uzupełniają.
N- jak już wspomniano, dołącza Nlinię wejściową ext do przestrzeni wzorów po wstawionym \nograniczniku ewline.
P- jak p; to Prints wzorzec-przestrzeń - ale tylko do pierwszego występującego \ncharakteru ewline. I tak, biorąc pod uwagę następujące dane wejściowe / polecenia:
printf %s\\n one two | sed '$!N;P;d'
sed Prints tylko jeden . Jednak z ...
D- jak d; to Deletes wzorzec-przestrzeń i zaczyna kolejną linię cyklu. W przeciwieństwie do d , Dusuwa tylko do pierwszego występującego \newline w przestrzeni wzorca. Jeśli po \nznaku ewline w przestrzeni wzorcowej znajduje się więcej przestrzeni , sedrozpoczyna się następny cykl linii od tego, co pozostało. Jeżeli dw poprzednim przykładzie zostały zastąpione z D, na przykład, sedby Prukuj zarówno jeden i dwa .
To polecenie jest powtarzane tylko dla wierszy, które nie pasują do s///instrukcji ubstitution. Ponieważ s///ubstitution usuwa \ndodaną ewline N, nigdy nie pozostaje nic po sed Dusunięciu przestrzeni wzorców.
Testy można wykonać w celu zastosowania Pi / lub Dwybiórczo, ale są też inne polecenia, które lepiej pasują do tej strategii. Ponieważ rekurencji jest realizowany obsłużyć kolejne linie, które pasują tylko część reguły zastępczej, kolejne sekwencje linii pasujących oba końce na s///ubstitution nie działają dobrze .:
Biorąc pod uwagę ten wkład:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... drukuje ...
first other characters "line"
<second>other characters line and so on
Poradzi sobie jednak
first "line"
second "line"
<second>line
...w porządku.
Drugie polecenie
To polecenie jest bardzo podobne do trzeciego. Obaj stosują etykietę :branch / test (jak pokazano również w odpowiedzi Joesepha R. tutaj ) i powracają do niej pod pewnymi warunkami.
-e :n -e- przenośne sedskrypty ograniczają :definicję etykiety za pomocą \newline lub nowej wbudowanej -einstrukcji xecution .
:n- definiuje etykietę o nazwie n. To może być zwrócone w dowolnym momencie albo bnalbo tn.
tn- tkomenda est powraca do określonej etykiety (lub, jeśli nie została podana, kończy działanie skryptu dla bieżącego cyklu linii), jeśli jakakolwiek s///ubstitution od czasu zdefiniowania etykiety lub ostatniego wywołania tests zakończyła się powodzeniem.
W tym poleceniu następuje rekurencja dla pasujących linii. Jeśli z sedpowodzeniem zastąpi wzorzec innymi znakami , sedpowraca do :netykiety i próbuje ponownie. Jeśli s///nie zostanie wykonana sedumstitution, automatycznie drukuje się przestrzeń wzorcowa i rozpoczyna się następny cykl linii.
Zwykle lepiej radzi sobie z kolejnymi sekwencjami. Tam, gdzie ostatni zawiódł, wyświetla się:
first other characters other characters other characters line and so on
Trzecie polecenie
Jak wspomniano, logika tutaj jest bardzo podobna do ostatniej, ale test jest bardziej wyraźny.
/"$/bn- to jest sedtest. Ponieważ bpolecenie ranch jest funkcją tego adresu, sedbędzie brancho tylko :npo \ndodaniu ewline, a przestrzeń wzorców nadal kończy się "podwójnym cudzysłowem.
Jest tak mało zrobione pomiędzy Ni bjak to możliwe - w ten sposób sedmożna bardzo szybko zebrać dokładnie tyle danych, ile jest to konieczne, aby upewnić się, że poniższy wiersz nie pasuje do twojej reguły. W s///różni się tutaj tym, że zatrudnia ubstitution gskroniowe flagi - i tak to zrobi wszelkie niezbędne zamienniki naraz. Biorąc pod uwagę identyczne dane wejściowe, polecenie wypisuje identycznie do ostatniego.
\noświadczenie ewline zrobić dlatego pytam. ludzie rzadko pytają, czy mogą zrobićs//\n/tak, jak ty z GNUsed, chociaż większość innychsedodrzuca tę ucieczkę po prawej stronie. mimo to funkcja\nucieczki będzie działać po lewej stronie w dowolnym POSIXsed- ie i można je przenośnie tłumaczyć tak,y/c/\n/jakby miało to ten sam efekt, cos/c/\n/gnie zawsze jest tak przydatne.