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.}

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.

vim