Странный zsh grep-P поведение

Можно попытаться получить 2.6 srpm от epel, Вы нашли, извлекаете файл спецификации из него, изменяете номер версии и восстанавливаете его.

Однако будьте осторожны: существует много пакетов в зависимости от python 2.4 на el5 (как конфетка). Необходимо будет, вероятно, удостовериться, что Вы устанавливаете 2.4 и 2.7 одновременно или что Вы имеете, восстанавливают все в зависимости от 2,4.

1
13.05.2012, 03:30
2 ответа

В двойных кавычках, символах $"\` останьтесь особенными. Можно путать их с одинарными кавычками: в одинарных кавычках все символы интерпретируются буквально, за исключением ' самостоятельно, который заканчивает строковый литерал.

$ cat /opt/jira/.subversion/config | grep -P "$[^#]"
zsh: bad math expression: operand expected at `^#'

$[…] синтаксис устаревший для арифметических выражений, которые могут быть записаны $((…)) как в оболочках POSIX. ^# не допустимое арифметическое выражение; оболочка ожидала операнд, такой как число или имя переменной.

[1]    broken pipe  cat /opt/jira/.subversion/config

Начиная со второй команды в конвейере, прерванном прежде, чем использовать весь вывод от cat (это даже не начало читать), первая команда (cat) полученный SIGPIPE.

$ cat /opt/jira/.subversion/config | grep -P "\$[^#]"
$ cat /opt/jira/.subversion/config | grep -P "\$#"

Обратная косая черта говорит оболочке интерпретировать следующий символ буквально, таким образом, grep видел шаблон $[^#] или $#. Эти шаблоны означают “конец строки, сопровождаемой любым символом кроме #” и “конец строки, сопровождаемой #” соответственно. Ни один из этих шаблонов ничему не может соответствовать.

$ cat /opt/jira/.subversion/config | grep -P "$#"

$# количество позиционных параметров ($1, $2, …, коллективно доступный как $@), т.е. аргументы передали командную строку оболочки или аргументы функции если в функции. В интерактивной оболочке обычно нет никаких позиционных параметров, таким образом, grep видел шаблон 0.

Шаблон, который Вы ищете, ^[^#] (^ соответствия в начале строки). Если Вы не означаете включать значение переменной оболочки или вывод команды в шаблоне, используйте одинарные кавычки (это не имеет значения здесь, но это имеет значение для некоторых шаблонов, особенно те, которые содержат обратную косую черту или a $). Вам не нужно -P поскольку этот шаблон записан таким же образом в основном regexps (плоскость grep), расширенный regexps (grep -E) и жемчуг regexps (grep -P).

$ </opt/jira/.subversion/config grep '^[^#]'
5
27.01.2020, 23:13

Я не могу сказать Вам точно, что, оказывается, дает вывод, Вы вошли в каждый случай. Однако существует две проблемы с тем, что Вы делаете:

  1. -P флаг (для совместимых с Perl регулярных выражений) считают экспериментальным, и не необходимы, для какого Вы пытаетесь сделать.

  2. $ символ конца строки в regex. Необходимо использовать символ запуска из строки, ^.


cat /opt/jira/.subversion/config | grep "^[^#]"

или более кратко,

grep "^[^#]" /opt/jira/.subverison/config

должен сделать то, что Вы хотите.

2
27.01.2020, 23:13
  • 1
    Вот именно! Не знайте, почему я использовал $. Но все еще интересный о выводах. –  Nakilon 12.05.2012, 14:02

Теги

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