Регулярное выражение PCRE, похоже, не работает при использовании из оболочки с grep - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь вывести узел, используя группу захвата для декомпилированного файла DTS, используя регулярное выражение PCRE, переданное в grep. Меня интересует только узел key-samkey {(...)};.

Есть идеи относительно того, что я могу делать неправильно, или вы можете указать какие-либо альтернативные методы для извлечения узла с его содержимым? Я не могу использовать оператор bash =~, потому что есть требование, чтобы мы использовали только sh.

Я пробовал шаблоны:

/(key-samkey {[.]*.+?[.]*};)/s

(key-samkey {[\s\S]*.+?(?=};))

Точная команда, которую я использую:

cat {input file} | grep -Po "{pattern}"

Оба эти шаблона работают правильно на веб-сайтах тестирования с помощью регулярных выражений сСинтаксис PCRE, но сбой при запуске из оболочки.

Файл, с которым я запускаю сопоставление с образцом, структурирован следующим образом:

/dts-v1/;

/ {

    signature {

        key-samkey {
            required = "conf";
            algo = "sha256,rsa4096";
            rsa,r-squared = <xxxxxxxx>;
            rsa,modulus = <xxxxxxxx>;
            rsa,exponent = <0xxx 0xxxxxx>;
            rsa,n0-inverse = <0xxxxxxxxx>;
            rsa,num-bits = <0xxxxx>;
            key-name-hint = "samkey";
        };
    };
};

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Ты почти у цели. Можно использовать регулярное выражение:

(?s)(key-samkey \{.+?\};).

  • (?s): точка . соответствует всему (DOTALL)
  • \{ и\}: Вы должны избегать их, потому что они имеют особое значение в регулярном выражении.
  • .+?: соответствует всему, что может быть не жадным, то есть, в данном случае, всему до первого };

Затем используйте переключатель -z grep, это заменяет символы новой строки во вводе нулевыми байтами, так что grep видит ввод как одну большую строку.

Пример:Я сохранил твой пример в файле test.file:

> grep -Pzo '(?s)(key-samkey \{.+?\};)' test.file

key-samkey {
            required = "conf";
            algo = "sha256,rsa4096";
            rsa,r-squared = <xxxxxxxx>;
            rsa,modulus = <xxxxxxxx>;
            rsa,exponent = <0xxx 0xxxxxx>;
            rsa,n0-inverse = <0xxxxxxxxx>;
            rsa,num-bits = <0xxxxx>;
            key-name-hint = "samkey";
        };
1 голос
/ 25 октября 2019

Более просто определить диапазон строк с помощью sed:

sed -n '/key-samkey {/,/};/p' file
...