строчные все, кроме содержимого в одинарных кавычках - Perl - PullRequest
0 голосов
/ 13 ноября 2018

Есть ли в perl способ заменить весь текст во входной строке, за исключением текста в одинарных кавычках (их может быть больше одного), с помощью регулярных выражений, я добился этого с помощью приведенного ниже кода, но хотел бы посмотреть, можно ли это сделать с регулярным выражением и картой.

while (<>) {
    my $m=0;
    for (split(//)) { 
        if (/'/ and ! $m) {
            $m=1;
            print;
        }
        elsif (/'/ and $m) {
            $m=0;
            print;
        }
        elsif ($m) {
            print;
        }
        else {
            print lc;
        }
    }
} 

**Sample input:**

and (t.TARGET_TYPE='RAC_DATABASE' or (t.TARGET_TYPE='ORACLE_DATABASE' and t.TYPE_QUALIFIER3 != 'racinst'))

**Sample output:**

and (t.target_type='RAC_DATABASE' or (t.target_type='ORACLE_DATABASE' and t.type_qualifier3 != 'racinst'))

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Еще один вариант с однострочником Perl.Я использую hex \ x27 для одинарных кавычек

$ cat sql_str.txt
and (t.TARGET_TYPE='RAC_DATABASE' or (t.TARGET_TYPE='ORACLE_DATABASE' and t.TYPE_QUALIFIER3 != 'racinst'))

$ perl -ne ' { @F=split(/\x27/); for my $val (0..$#F) { $F[$val]=lc($F[$val]) if $val%2==0 } ; print join("\x27",@F) } ' sql_str.txt
and (t.target_type='RAC_DATABASE' or (t.target_type='ORACLE_DATABASE' and t.type_qualifier3 != 'racinst'))

$
0 голосов
/ 17 ноября 2018

Разве вы не слишком усердно играете с регулярным выражением для такой простой работы?

Почему бы сегодня не разделить ребенка на это?

#!/usr/bin/perl
while (<>)
{
    @F = split "'";
    @F = map { $_ % 2 ? $F[$_] : lc $F[$_] } (0..@F);
    print join "'", @F;
}

Выше приведено для понимания,Мы часто разумно объединяем две последние строки:

print join "'", map { $_ % 2 ? $F[$_] : lc $F[$_] } (0..@F);

Или наслаждаемся большим, делая его однострочным?(в оболочке bash) В принципе это выглядит следующим образом:

perl -pF/'/ -e 'join "'", map { $_ % 2 ? $F[$_] : lc $F[$_] } (0..@F);' YOUR_FILE

В действительности, однако, мы должны уважать оболочку и выполнить некоторую побег (тяжелую) работу:

perl -pF/\'/ -e 'join "'"'"'", map { $_ % 2 ? $F[$_] : lc $F[$_] } (0..@F);' YOUR_FILE

(Одиночная кавычка должна состоять из 5 букв: '"'"')

Если это не помогает вашей работе, это помогает спать.

0 голосов
/ 13 ноября 2018

Вы можете дать этому шанс.Все одно регулярное выражение.

$str =~ s/(?:^|'[^']*')\K[^']*/lc($&)/ge;

Или, чище и более задокументировано (это семантически эквивалентно приведенному выше)

$str =~ s/
  (?:
    ^     | # Match either the start of the string, or
    '[^']*' # some text in quotes.
  )\K       # Then ignore that part,
            # because we want to leave it be.
  [^']*     # Take the text after it, and
            # lowercase it.
  /lc($&)/gex;

Флаг g указывает регулярному выражению запускаться столько разкак необходимо.e говорит, что подстановочная часть (в нашем случае lc($&)) - это код Perl, а не просто текст.x позволяет нам разместить эти комментарии там, чтобы регулярное выражение не было полным бредом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...