Wyrażenie we wzorcach szukania (expressions inside the search patterns)
Posted on Tue 19 September 2006 in Tips 4 VIM, Tips text {sed, awk, perl, etc.} • 2 min read
Wyrażenia we wzorcach wyszukiwań to potężne narzędzie ale używam ich od czasu do czasu więc co jakiś czas muszę odszukiwać w sieci tutoriale na ich temat. Nie chcę tego powtarzać w nieskończoność, więc wkładam podstawowe informacje tutaj.
W skrócie: jeśli chcę zgrupować wzorce w przeszukiwanym tekście aby następnie operować nimi w dowolnej kolejności muszę każdy taki wzorzec zawrzeć pomiędzyz znakami \( i \).
Np.: aby stworzyć grupę dwóch cyfr mogę napisać tak: \(\d\d\). Do każdej takiej grupy wzorców mogę się odwoływać przez numer wzorca poprzedzony backslashem czyli \1.
Przykład:
zawartość pliku:
1;A.02.01.pdf;PN-A 2;A.02.02.pdf;PD 3;A.02.03.pdf;PD 4;A.02.04.pdf;Z,PD 5;A.02.05.pdf;Z 6;A.02.06.pdf;Z 7;A.02.07.pdf;Z 8;A.02.08.pdf;Z,PN 9;A.02.09.pdf;PN 10;A.02.10.pdf;W-A 11;A.02.11.pdf;W-A 12;A.02.12.pdf;PN
używam następującego zaklęcia:
:%s@\(\d\=\)\(;\)\(\u.\d\d.\d\d.pdf\)\(;\)\(\u.*$\)@UPDATE lokale SET rzuty='\3',strony_swiata='\5' WHERE id=\1;@g
gdzie znak @ jest znakiem rodzielającym wzorce szukania (search) od części zastępującej (replace), użyam ich zamiast standardowego slasha "/" dla większej przejrzystości (ma też to inną, ciekawą funkcję - eliminuje konieczność backslashowania niektórych znaków specjalnych). Każda grupa dopasowania zaczyna się, jak wspomniałem wyżej, znakami \( i kończy \). Takich grup jest w powyższym wyrażeniu pięć. Odwołujemy się do każdej z nich odpowiednio: \1, \2, itd. Po wykonaniu powyższego zaklęcia otrzymamy nową zawartość pliku:
UPDATE lokale SET rzuty='A.02.01.pdf',strony_swiata='PN-A' WHERE id=1; UPDATE lokale SET rzuty='A.02.02.pdf',strony_swiata='PD' WHERE id=2; UPDATE lokale SET rzuty='A.02.03.pdf',strony_swiata='PD' WHERE id=3; UPDATE lokale SET rzuty='A.02.04.pdf',strony_swiata='Z,PD' WHERE id=4; UPDATE lokale SET rzuty='A.02.05.pdf',strony_swiata='Z' WHERE id=5; UPDATE lokale SET rzuty='A.02.06.pdf',strony_swiata='Z' WHERE id=6; UPDATE lokale SET rzuty='A.02.07.pdf',strony_swiata='Z' WHERE id=7; UPDATE lokale SET rzuty='A.02.08.pdf',strony_swiata='Z,PN' WHERE id=8; UPDATE lokale SET rzuty='A.02.09.pdf',strony_swiata='PN' WHERE id=9; UPDATE lokale SET rzuty='A.02.10.pdf',strony_swiata='W-A' WHERE id=10; UPDATE lokale SET rzuty='A.02.11.pdf',strony_swiata='W-A' WHERE id=11; UPDATE lokale SET rzuty='A.02.12.pdf',strony_swiata='PN' WHERE id=12;
Jak widać na załączonym obrazku, grupami wzorców można "obracać" w dowolnej kolejności.