Я хочу найти все пакеты, которые обеспечивают общий объект, содержащий "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.*
т.е. Я вышел из обратной косой черты, которая, как предполагалось, вышла из точки. Это дало мне результаты, которые я хотел.
Кто-то мог объяснить, почему мне нужна двойная обратная косая черта в этом случае?
Вам нужна двойная обратная косая черта \\
, потому что единственная обратная косая черта не является только regex символом ESC, но также и тем Ваше использование оболочки. Например, Вы выходите из точки, которая на уровне оболочки просто интерпретирует к регулярной точке, которая тогда передается способному - добираются и machtes каждый символ (как регулярная точка обычно делает).
, Таким образом, ответ, сначала строка интерпретируется оболочкой, где обратная косая черта имеет значение того, и после , что, это передается способному - добираются. Regex-механизм способных - добирается, тогда интерпретирует предварительно обработанную строку снова. Там обратная косая черта была заменена (и также имеет немного отличающееся значение).
Другое решение состоит в том, чтобы поместить regex в кавычки как в:
apt-file search --regexp '.*ssl.*\.so.*'
Если Вы не используете заключенный в кавычки шаблон, необходимо выйти из обратной косой черты для 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
Проблема состоит в том, что, поскольку Вы не используете заключения в кавычки, необходимо выйти и из оболочки и из интерпретатора регулярного выражения оба для интерпретации .
как литерал.
Это - причина, почему заключение в кавычки важно. Ваш первый шаблон работал бы, если Вы просто используете кавычки вокруг этого:
apt-file search --regexp '.*ssl.*\.so.*'
Главное отметить, что наша заключительная цель состоит в том, чтобы позволить regex интерпретатору apt-file
взять .
буквально, а не обычным способом т.е. любым отдельным символом.
Второй случай:
apt-file search --regexp .*ssl.*\\.so.*
Первое \
здесь должен выйти из оболочки, поскольку оболочка рассматривает любого \
поскольку часть обратной косой черты вышла из последовательностей, например, обработок оболочки \n
как новая строка, \t
как горизонтальная вкладка и т.д.
С синглом \
как в .*ssl.*\.so.*
, обработки оболочки .
как \
завершенный специальный символ, но .
не имеет никакого особого значения для окружения, так просто \
удален оболочкой, уехав только a .
. С \\.
оболочка удаляет первое \
оставление позади \.
как литерал \
представлен \\
в оболочке.
Таким образом, мы имеем .*ssl.*\.so.*
оставленный как шаблон Regex, который будет интерпретироваться apt-file
Perl интерпретатор Regex. Таким образом, Вы получили бы желаемый результат.