Возникли проблемы при создании сценария оболочки из командной строки - PullRequest
0 голосов
/ 02 июня 2019

Мне трудно использовать переменные внутри команды perl.

Я пытаюсь преобразовать команду perl в скрипт bash.Сценарий bash будет использоваться для поиска любого заданного файла по заданному шаблону регулярных выражений.Сценарий bash должен сначала запросить, какой файл открыть, а затем запросить шаблон регулярных выражений.

У меня уже есть рабочая командная строка, и все, что я пытался преобразовать в сценарий bash, не работает ... Я неУ меня нет большого опыта работы с командной строкой и скриптом bash, и я много читал в Интернете, и, похоже, ничего не работает.

#!/bin/bash

read -p "Enter the path to the file : " file_path
read -p "Enter the regular expression : " reg_exp

perl -ln0777e 'my $count=1; print "===================== RESULTS ====================="; while (/'"${reg_exp}"'/g) {printf("[%02d] Offset: 0x%x length: %dB\n     Position: %d to %d \n     Hex match: %s\n     Original: %s\n", $count++, $-[ 0 ], length $1, $-[ 0 ], $-[ 0 ] + length( $1 ) - 1, unpack("H*",$1), $1)}' "${file_path}"

Когда я пытаюсь использовать переменные внутри регулярного выражения, это не таккажется, интерпретируется как переменная ...

Вот как должен выглядеть результат: введите описание изображения здесь

Моя командная строка такова:

perl -ln0777e 'my $count=1; print "===================== RESULTS ====================="; while (/REGULAR_EXPRESSION/g) {printf("[%02d] Offset: 0x%x length: %dB\n     Position: %d to %d \n     Hex match: %s\n     Original: %s\n", $count++, $-[ 0 ], length $1, $-[ 0 ], $-[ 0 ] + length( $1 ) - 1, unpack("H*",$1), $1)}' SOURCE_FILE

РЕШЕНИЕ:

Вот рабочий код, который я придумал.Спасибо Икегами за помощь!

#!/bin/bash
read -rp "Enter the path to the file : " file_path
read -rp "Enter the regular expression : " reg_exp

perl -sn0777e'
   while (/$reg_exp/g) {
      printf "[%1\$02d] Matched %2\$d bytes from position %3\$d (0x%3\$x) to %4\$d (0x%4\$x)\n",
         ++$count, $+[0]-$-[0], $-[0], $+[0]-1;
      printf "     Hex: %s\n", unpack("H*", $&);
      printf "     Match: %s\n", $&; 
   }
' -- -reg_exp="${reg_exp}" -- "${file_path}"

1 Ответ

4 голосов
/ 03 июня 2019

Фрагмент пытается сгенерировать код Perl, но он делает это неправильно.Это известно как ошибка вставка кода .

Самый простой способ исправить это - вообще не создавать код Perl. Этот другой ответ предлагает способы передачи данных в однострочную строку Perl.Мы будем использовать второй здесь.

perl -sn0777e'
   while (/$reg_exp/g) {
      printf "[%1\$02d] Matched %2\$d bytes from position %3\$d (0x%3\$x) to %4\$d (0x%4\$x)\n",
         ++$count, $+[0]-$-[0], $-[0], $+[0]-1;
      printf "Match: %s\n", $&; 
      printf "Hex: %s\n", unpack("H*", $&);
   }
' -- -reg_exp="$reg_exp" -- "$file_path"

Я сделал несколько изменений:

  • Я удалил (непроверенное) ожидание того, что шаблон будет внедрен в захватиспользуя комбинацию $& и $+[0] вместо $1length($1)).
  • Я сделал вывод чище и более самосогласованным.
  • Я сделал кодболее читабельно.

Обратите внимание, что вы можете получить странный вывод для совпадений из 0 символов (например, 0 bytes from position 6 to 5).По этой причине часто используется исключительная конечная позиция ($+[0] вместо $+[0]-1).Я оставил это без изменений, так как совпадения из 0 символов маловероятны, и часто используются инклюзивные позиции.

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