Вопрос: Удалить строки, соответствующие строке в grep


У меня есть несколько длинных файлов конфигурации, чтобы пройти, и я хотел бы видеть просто что на самом деле активно .conf файла без каких-либо # теги. Что я могу использовать для вывода строк без  # в теме? Я запускаю Debian Wheezy с помощью этой команды.


2
2017-08-20 16:00


Источник




Ответы:


Если файл назван foo.conf:

grep -E '^[^#].*' foo.conf должен это сделать.

Объяснение:

-E: Поддержка расширенных регулярных выражений!

'^[^#].*': Регулярное выражение, окруженное одинарными кавычками.

^[^#].*: Само регулярное выражение.

^(в позиции 0 регулярного выражения): Говорит «Матч начинается с начала строки / первого символа сразу после строки новой строки или первого символа самого файла».

[^#]: Говорит: «Сопоставьте ровно один символ, который не персонаж #«.

.*: Говорит: «Совпадает ноль или больше Любые символы, кроме строки новой строки, для остальной части строки. "

Чистым эффектом является то, что если у вас есть файл с содержимым, например:

#foo
bar
#baz
fly

Это регулярное выражение будет не совпадают первая и третья строки, поскольку первый символ в начале строк 1 и 3 на самом деле является #, поэтому часть регулярного выражения, требующая ровно одного не-# ([^#]) не соответствует, поэтому grep исключает эту строку.

Тогда регулярное выражение будет добиться соответствия остальная часть строк, потому что первый символ в начале строк 2 и 4 действительно не  #,

Основываясь на нашем успехе, вы также можете сопоставлять такие строки, как:

    #I am tricky!

(Обратите внимание: пробельные (вкладки или пробелы) перед комментарием, и поскольку он по-прежнему остается комментарием, мы этого не хотим!)

используя следующее:

grep -P '^\s*+[^#].*' foo.conf

(но .* строго не требуется; Знаю, знаю.)

Итак, теперь у нас есть:

-P: Поддержка Perl-совместимые регулярные выражения! (Подсказка: может быть недоступна повсеместно во всех версиях / реализациях grep, но он по крайней мере доступен некоторое время сейчас в GNU Grep.)

\s*+: Маленькое добавленное регулярное выражение, которое говорит: «Сопоставьте нулевые или более пробельные символы, что означает пробелы или вкладки, и если вы делать увидишь их, ты ДОЛЖЕН их съесть ». Эта последняя часть очень важна, потому что без притяжательного квантора *+, пространство может соответствовать как часть [^#], что бы обмануть регулярное выражение. Потенциальные кванторы не существуют в POSIX Compatible (Basic или Extended), так что здесь мы должны использовать PCRE. Там может быть способ сделать это без притяжательного квантификатора, но я не знаю об этом.


2
2017-08-20 16:04



1) для этого вам не нужен расширенный grep, выражение «не расширено». 2) это приведет только к удалению строк, где комментарий является первым символом, который не является частью требований. 3). В этом случае нет необходимости, хотя иногда полезно использовать grep -o - Rich Homolka
1) Извлеченный урок; Ты прав. 2) Исправлено обновление с использованием PCRE и притяжательного квантификатора. Он ищет строки, которые, по мнению анализатора файлов conf, являются комментариями, а не только строками, которые содержат # где-то в них. Комментарии в большинство файлы - это те строки, которые начинаются либо с # в первом столбце, или с # после некоторых пробелов. 3) Извлеченный урок, спасибо. - allquixotic


grep -v '#' file

Вам нужно указать #, потому что ваша оболочка может интерпретировать это как комментарий.

Grep удалит любую строку с # на ней. Возможно, это не то, что вы хотите. Что может быть более полезным, так это удаление комментариев. Вы можете использовать sed или «Редактор потока». Это может дать вам то, что вы хотите.

sed -e 's/#.*//' < file | less

Регулярное выражение говорит «найти от символа комментария до конца строки и удалить его», а затем перейти на меньшее, чтобы читать его легче.

Если комментарии всегда находятся в первом столбце, вы можете использовать метод, написанный @somequixotic, который показывает только строки, в которых нет комментария в первом столбце.


4
2017-08-20 16:03



Этот ответ неверен, поскольку строка, такая как olol#olol (или, более практически со сценарием, такой строки, как ./baz.sh #this does ... не будет соответствовать этой стратегии, тогда как если вы используете расширенное регулярное выражение, как в моем ответе, оно будет успешно соответствовать. (Этот комментарий основан на тексте этого ответа на его оригинал пересмотр.) - allquixotic
@somequixotic да, я думал об этом после того, как я опубликовал. Я уже редактировал его. Спасибо хоть. - Rich Homolka
Удалено мое понижение - allquixotic