grep. Найдите несколько И шаблоны в любом порядке с помощью единственного условия

Когда Вы хотите изменить файл, у Вас есть две опции, каждый с его преимуществами и недостатками.

  • Можно перезаписать файл на месте. Это не использует дополнительного пространства и сохраняет жесткие ссылки, полномочия и любой другой атрибут вне содержания существующего файла. Главный недостаток выполнения этого состоит в том, что, если что-нибудь происходит, в то время как файл пишется (сбои приложения, или питание выходит), Вы заканчиваете с частично записанным файлом.
  • Можно записать новую версию файла в новый файл с другим именем, затем переместить его в место. Это использует больше пространства и разрывает жесткие связи, и если у Вас есть полномочия записи на файле, но не на каталоге оно содержит, Вы не можете сделать этого вообще. На обороте старая версия файла атомарно заменяется новой версией, таким образом, в каждом моменте времени имя файла указывает на допустимую, полную версию файла.

Mcedit спрашивает Вас который стратегия выбрать. Странно, хотя, стратегия mcedit по умолчанию, для файлов с единственной записью каталога, состоит в том, чтобы усечь существующий файл, подвергнув Ваши данные опасности. Только то, когда безопасная стратегия разорвала бы жесткую связь, делает она дает Вам возможность использовать его. Можно измениться, это в “Редактировании сохраняет режим” диалоговое окно из меню параметров: “быстрое сохранение” означает перезапись, “безопасное сохранение” означает, сохраняют во временный файл, затем переименовывают. Когда безопасный режим выбран, Вы не получаете выбор не разорвать символьные связи.

(Наблюдения, сделанные на мГц 4.8.3. Если это все еще имеет место в последней версии, рассмотрите создание отчетов о ней как ошибку дизайна — “безопасный режим” должен быть значением по умолчанию, и необходимо получить опцию не разорвать жесткие связи в этом случае.)

Хорошие редакторы, такие как Vim или Emacs позволяют Вам выбрать стратегию по умолчанию.

5
13.04.2017, 15:36
5 ответов

Если ваша версия grep поддерживает PCRE (GNU grep делает это с опцией -P или --perl-regexp), вы можете использовать lookaheads для сопоставления нескольких слов в любом порядке:

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word3)^.*$'

Это не будет выделять слова. Обозрения - это утверждения нулевой длины, они не являются частью последовательности совпадения.

Думаю, ваше решение с трубами должно сработать для этого. По умолчанию grep только раскрашивает вывод, когда он идет к терминалу, поэтому только последняя команда в трубопроводе делает подсветку, но вы можете переопределить это с помощью --color=always.

grep --color=always foo | grep --color=always bar
3
27.01.2020, 20:41

Вы можете сделать это с одним ИЛИ-регенерацией. Учитывая содержимое файла:

This is my file
It has many words
There are also many chars

Следующая команда grep выделит 'my' и 'There' в одном аргументе:

grep -P -e '(there|my)' testfile

Просто отделите каждый шаблон регенерации с помощью | (pipe) для указания ИЛИ.

-3
27.01.2020, 20:41

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

Но даже с небольшим количеством шаблонов, скажем, шесть, перестановки будут 6!, Или 720. Это делает для неловкой командной строки.

Но видя, как вы, кажется, не имеют ссорящих с трубопроводом GREP , за исключением

, и это будет работать, но я хотел бы видеть цветной выход

, при условии, что при условии, что :

  • Узоры не совпадают
  • . Шаблоны не содержат терминов управления

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

Затем для обеспечения того, чтобы окраска работать, вы придется заставить GREP в , полагая, что его стандартный выход - это терминал , используя Faketerm или иным образом, Или если доступно (он должен быть), вы можете использовать опцию - Color = Anter - Color =

cat file | grep --color=always pattern1 \
         | grep --color=always pattern2 \
         ...
         | grep --color=always patternN 

(приятный поворот будет обернуть GREP в одну строку Для выполнения подпунктом и генерировать строку программно, используя, например, SED ).

3
27.01.2020, 20:41

Вы можете раскрасить вывод с помощью sed

sed -n "/foo/{/bar/s/foo\|bar/\x1b[1;31m&\x1b[m/gp}"
0
27.01.2020, 20:41

Следующее легко запомнить, хотя смысл не так ясен:

cat file | grep pattern1 | grep pattern2 | grep pattern3 | grep -e pattern1 -e pattern2 -e pattern3
0
20.08.2021, 12:37

Теги

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