Где определяются псевдонимы по умолчанию

Глядя на ваш вопрос, я подумал, что должно быть возможно решить его с помощью grep+ PCRE .

  • Метод #1 решает эту проблему, спасибо @issac за помощь в его разработке.
  • Метод #2 показывает, как можно использовать встроенный модификатор((?s))и просмотр вперед(?!...).
  • Мое исходное решение (#3 )хорошо работает в большинстве ситуаций, за исключением типов, которые я выделяю ниже в соответствующем разделе.

метод grep #1

$ grep -Pzo -- '--\nare([^\n]*\n)+?(?=--|\Z)' afile

Как это работает

переключатели grep
  • -P-Расширения PCRE включены
  • -z-обрабатывает ввод как несколько строк -, используя NUL вместо\n(новых строк)
  • -o-показывать только совпадения
регулярное выражение
  • --\nare([^\n]*\n)+?(?=--|\Z)
    • соответствует двойным дефисам, за которыми следует are, а затем продолжение нуля или более не -символов новой строки -или -новой строки.
    • +?будет соответствовать 1 или более, но не будет -жадным, поэтому он не будет агрессивно продолжаться.
    • Наконец, (?=--|\Z)охраняет конец блока в поисках следующего двойного тире --или конца файла(\Z).

метод grep #2

Этот метод использует встроенный модификатор DOTALL, чтобы .соответствовал символам новой строки (`n `).

$ grep -Pzo -- '(?s)--\nare((?!\n--).)+\n' afile

Как это работает

переключатели grep
  • -P-Расширения PCRE включены
  • -z-интерпретирует ввод как несколько -строк, используя NUL вместо\n(новых строк)
  • -o-показывать только совпадения
регулярное выражение
  • (?s)-встроенный модификатор DOTALL -все точки для соответствия новой строке
  • --\nare-соответствует новой строке, за которой следуетare
  • ((?!\n--).)+\n-соответствует символам ., пока просмотр вперед (?!\n--)не встречает \n--.Весь этот блок сопоставления должен состоять как минимум из одного или нескольких(+)и сопровождаться символом новой строки \n.

метод grep #3 (оригинальный)

Вот grepрешение, в котором используется расширение PCRE(-P).. Этот метод работает для всех предоставленных примеров, он не работает с такими примерами, как этот:

--
are
some-other-dasher

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

$ grep -Pzo -- '--\nare[^\r\n]+[^-]+' afile
--
are you happy

--
are(you hungry
too

Как это работает

переключатели grep
  • -P-Расширения PCRE включены
  • -z-обрабатывает ввод как несколько -строк, используя NUL вместо\n(новых строк)
  • -o-показывать только совпадения
регулярное выражение
  • '--\nare[^\r\n]+[^-]+'
    • соответствует двойным дефисам, за которыми следует новая строка, и слову are.
    • Затем он продолжит печатать оставшуюся часть строки, на которой находится are, пока не встретит новую строку.
    • Затем он печатает символы до тех пор, пока не встретится последовательность дефисов.

Ссылки

2
11.08.2020, 18:46
2 ответа

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

Вместо этого я бы порекомендовал вам:

  1. Либо определите/отмените определение псевдонимов, используя ~/.bashrc(, это будет работать только для одного пользователя)

  2. Или добавьте свои собственные определения через /etc/profile.d/my-definitions.shфайл (s ).

2
18.03.2021, 23:13

Они определены в /etc/profileфрагментах в /etc/profile.d; например, псевдоним egrepпроисходит от /etc/profile.d/colorgrep.sh.

3
18.03.2021, 23:13

Теги

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