Поиск и замена регулярных выражений группой захвата в файле CSS - PullRequest
1 голос
/ 03 февраля 2020

У меня есть файл CSS, который содержит набор правил, обернутых в @critical rule, содержащую критические стили, содержимое которых я хочу извлечь для встраивания:

@critical {

    .foo {
        ...
    }

    @media bar {
        ...
    }
}

Я пытаюсь выполнить извлечение с использованием sed поиска и замены с помощью следующего регулярного выражения (я нахожусь на Ma c, отсюда и флаг -E):

sed -i '' -E 's,@critical[^{]*{\s*((.|\s)*)[^}]*},\1,g' style.css

Фактически я пытаюсь заменить весь @critical Правило только с его содержанием (соответствует группе 1). Регулярное выражение critical[^{]*{\s*((.|\s)*)[^}]*} само по себе прекрасно работает, когда я подключаю его к RegExr , но я не могу заставить его работать в контексте приведенной выше команды sed. Что я делаю неправильно?

Большое спасибо заранее.

—————

Редактировать:

С тех пор я узнал что sed не поддерживает многострочное регулярное выражение, которое объясняет проблему, с которой я сталкиваюсь. Если минимизировать CSS (фактически превращая его в одну строку текста), чтобы он работал под sed, я все равно был бы признателен за то, что кто-то указал мне на решение, которое работает с неминифицированным многострочным файлом CSS (perl? Awk?).

1 Ответ

2 голосов
/ 05 февраля 2020

Если perl является вашим вариантом, попробуйте:

perl -0777 -i.bak -pe 's,\@critical[^{]*{\s*((.|\s)*)[^}]*},$1,g' style.css

Тогда style.css будет выглядеть следующим образом:

.foo {
        ...
    }

    @media bar {
        ...
    }

  • Переключатель -0777 perl
  • Опция -i.bak позволяет редактировать файл на месте, сохраняя файл резервной копии с расширением .bak. Если резервное копирование не требуется, просто поставьте -i.
  • Регулярное выражение внутри почти идентично вашему, за исключением обратной косой черты перед знаком «at». В противном случае perl пытается интерпретировать его как имя переменной массива. Еще одно изменение - $1 вместо \1 в замене. Это также требование perl.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...