Czy istnieje sposób, aby powiedzieć, sed
aby zastąpić wzorzec przy co drugim wystąpieniu? A przynajmniej na co drugą linię? (Pewnie, że jest to możliwe dzięki skryptowi, ale zastanawiałem się, czy sed
mogę to zrobić).
Edytować
znalazłem
sed -e "s/pattern/replacement/g;n"
Ale zastępuje to za każdym razem, a nie za drugim razem.
Przykład
Plik wejściowy:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Pożądane wyjście:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
rozwiązać problem.Zastąpi drugie wystąpienie w każdej linii, która ma wzorzec.
jeśli masz GNU
sed
:Począwszy od pierwszego wiersza
1
, wiersz po nim zostanie dodany do obszaru wzorów,N
a następnies
polecenie zastąpi drugie wystąpienie wzoru. następniesed
przesunie się o dwie linie w dół~2
i powtórzy.źródło
code
(sed '1 ~ 2s / pattern / replace /')Prosta interpretacja:
W pierwszym wierszu, który zawiera co najmniej jedno wystąpienie WZORCA, chcesz go zignorować i wydrukować taki, jaki jest. W drugim wierszu, który zawiera co najmniej jedno wystąpienie WZORU, chcesz zastąpić pierwsze wystąpienie WZORU WYMIANĄ. W trzecim wierszu, który zawiera co najmniej jedno wystąpienie WZORCA, chcesz wydrukować wiersz bez zmian. W czwartym wierszu, który zawiera co najmniej jedno wystąpienie WZÓR, chcesz zastąpić pierwsze wystąpienie WZORU zamieniem. I tak dalej. Linie, które nie pasują do WZORU, powinny być drukowane bez zmian.
Można to łatwo zrobić za pomocą Sed:
Lub z mniejszą ilością białych znaków i krótszą etykietą:
EDYCJA: Właśnie przeczytałem pytanie i zauważyłem trudniejszą interpretację:
Zamień drugie wystąpienie WZORCA w całym dokumencie na WYMIANA, niezależnie od tego, czy występuje w tym samym wierszu co pierwsze wystąpienie, czy nie. Pozostaw pierwsze i trzecie wystąpienie bez zmian. Itp.
Sądzę, że można to zrobić również za pomocą Sed, chociaż jest DUŻO trudniejsze i uważam, że zależy to od używanego wyrażenia regularnego. Spróbuję coś wymyślić i opublikować, ale na razie pozwolę tej odpowiedzi stać na powyższą prostą wersję.
źródło
t
est naq
uit i weź dane wejściowe jak,{ sed '...'; cat; } <input
dla jednego zamiennikaByłeś bardzo blisko, po prostu pomiń pierwszą linię:
Dlaczego
awk
w tym przypadku powinno być lepsze narzędzie?źródło
Jeden wzór symboli w jednym wierszu: sed 's / (a [^ a] *) a / \ 1c / g'
Co drugi wzór (może pojawić się tylko jedno dopasowanie wzoru na linię. Jeśli pojawią się dwa lub więcej dopasowań na jedną linię, tylko drugi zostanie zastąpiony)
źródło