[vim] wyrażenia regularne

0

Potrzebuję zamieć ciąg

<cat><![CDATA[Dom i wnętrze/Meble/Sypialnia/Szafki nocne]]></cat>

na

<cat><![CDATA[Dom i wnętrze > Meble > Sypialnia > Szafki nocne]]></cat>

ułożyłem testowe wyrażenie regularne do szukania ciągu

<cat><!\[CDATA\[([\w\sąćęłńóśźż]*/*)*\]\]><\/cat>

oraz do zamiany ciągu

<cat><!\[CDATA\[([\w\sąćęłńóśźż]*\s>\s*)*\]\]><\/cat>

Każdy z programów znalezione wyrażenie regularne zmanienia na ciąg <cat><![CDATA[([\w\sąćęłńóśźż]\s>\s)*]]></cat>, bez jego logicznej podmiany.

Jak można między <cat> ... </cat> zmieć ciągi znaków z "/" na " > "?

1

Jeśli liczba sekcji jest stała

<cat><!\[([^/]+)/([^/]+)/([^/]+)/([^/]+?)\]\]></cat>

Ostanie celowo jest non greedy.

Wzór do replace:

<cat><![$1 > $2 > $3 > $4]]></cat>

Tak poza tym z tego co mi wiadomo \w powinno łapać polskie znaki. Jeśli tego nie robi coś nie tak jest z twoim programem, albo dokument nie jest otwarty we właściwym kodowaniu. Nie zadziałało ci pewnie dlatego, że zapomniałeś, że tam są spacje, a \w nie łapie białych znaków.


Wpisz w vim: ```regexp :s#<cat><!\[([^/]+)/([^/]+)/([^/]+)/([^/]+?)\]\]></cat>#<cat><![$1 > $2 > $3 > $4]]></cat>#g ```
0

Można też przy pomocy perla, jak masz więcej takich plików to takie rozwiązanie może być przydatne przy automatyzacji:

#!/usr/bin/perl -w

if(defined $ARGV[0] && defined $ARGV[1]){
    open(my $input_file,"<",$ARGV[0]) or die("Error: open input file\n$!\n");
    open(my $output_file,">",$ARGV[1]) or die("Error: open output file\n$!\n");
    my $start_cut = '\s*<cat><!\[CDATA\[';
    my $end_cut = '\]\]><\/cat>\s*';
    foreach my $line(<$input_file>){
        if($line =~ /($start_cut)(.*?)($end_cut)/){
            my $result = $1.join(' > ',split(/\//,$2)).$3;
            print $output_file $result;
            print "Change in file $ARGV[0]: $result\n";
        }else{
            print $output_file $line;
        }
    }
    close($input_file);
    close($output_file);
}else{
    die("script.pl <input_file> <output_file>");
}

1

Poprawiona wersja tego co dał @MarekR22

:s#\(<cat>.*\)\@<=/\(.*</cat>\)\@=# > #g

@MarekR22 użył składni Perla, która nie jest używana przez Vima.

1 użytkowników online, w tym zalogowanych: 0, gości: 1