способный файл regex: выход из точки

Я хочу найти все пакеты, которые обеспечивают общий объект, содержащий "ssl" в имени файла. В странице справочника способного файла говорится:

- regexp |-x шаблон Обработки как (жемчуг) регулярное выражение. См. perlreref (1) для деталей. Без этой опции шаблон рассматривают как литеральную строку для поиска.

Поэтому моя первая попытка была

apt-file search --regexp .*ssl.*\.so.*

Это, однако, дало мне результаты такой как

остроумные примеры:/usr/lib/Wt/examples/feature/client-ssl-auth/resources

который не имеет никакого ".so" в имени файла.

Я играл вокруг немного и придумал

apt-file search --regexp .*ssl.*\\.so.*

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

Кто-то мог объяснить, почему мне нужна двойная обратная косая черта в этом случае?

3
задан 31 August 2019 в 12:15

3 ответа

Вам нужна двойная обратная косая черта \\, потому что единственная обратная косая черта не является только regex символом ESC, но также и тем Ваше использование оболочки. Например, Вы выходите из точки, которая на уровне оболочки просто интерпретирует к регулярной точке, которая тогда передается способному - добираются и machtes каждый символ (как регулярная точка обычно делает).

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

Другое решение состоит в том, чтобы поместить regex в кавычки как в:

apt-file search --regexp '.*ssl.*\.so.*'
4
ответ дан 1 December 2019 в 13:16

Если Вы не используете заключенный в кавычки шаблон, необходимо выйти из обратной косой черты для RegEx:

apt-file search --regexp .*ssl.*\\.so.*

С заключенным в кавычки шаблоном, Вам не нужно это:

apt-file search --regexp '.*ssl.*\.so.*'
<час>

Пример

$ apt-file search --regexp .*ssl.*\\.so.* > ~/tmp/bar
$ apt-file search --regexp '.*ssl.*\.so.*' > ~/tmp/foo
$ diff foo bar | wc -l
0
1
ответ дан 1 December 2019 в 13:16

Проблема состоит в том, что, поскольку Вы не используете заключения в кавычки, необходимо выйти и из оболочки и из интерпретатора регулярного выражения оба для интерпретации . как литерал.

Это - причина, почему заключение в кавычки важно. Ваш первый шаблон работал бы, если Вы просто используете кавычки вокруг этого:

apt-file search --regexp '.*ssl.*\.so.*'

Главное отметить, что наша заключительная цель состоит в том, чтобы позволить regex интерпретатору apt-file взять . буквально, а не обычным способом т.е. любым отдельным символом.

Второй случай:

apt-file search --regexp .*ssl.*\\.so.*
  • Первое \ здесь должен выйти из оболочки, поскольку оболочка рассматривает любого \ поскольку часть обратной косой черты вышла из последовательностей, например, обработок оболочки \n как новая строка, \t как горизонтальная вкладка и т.д.

    С синглом \ как в .*ssl.*\.so.*, обработки оболочки . как \ завершенный специальный символ, но . не имеет никакого особого значения для окружения, так просто \ удален оболочкой, уехав только a .. С \\. оболочка удаляет первое \ оставление позади \. как литерал \ представлен \\ в оболочке.

  • Таким образом, мы имеем .*ssl.*\.so.* оставленный как шаблон Regex, который будет интерпретироваться apt-filePerl интерпретатор Regex. Таким образом, Вы получили бы желаемый результат.

3
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: