Как вы соответствуете строке, которая начинается с специального символа с помощью grep?

У меня есть много файлов .txt в моем каталоге, которые содержат строки, начинающиеся с '='

Для ex: a.txt имеет следующую строку (сначала с пробелами)

=putSomething here; 

Как написать grep-запрос, который будет соответствовать указанной выше строке? Я попробовал следующее:

 find . -name "*.txt" | xargs grep -rn "^[=].*$" 

4 Solutions collect form web for “Как вы соответствуете строке, которая начинается с специального символа с помощью grep?”

Возьмем этот образец файла:

 $ cat file.txt =putSomething here; 

Теперь, чтобы найти все такие .txt файлы в текущем каталоге:

 $ grep -n '^[[:space:]]*=' *.txt file.txt:1: =putSomething here; 

Если вы хотите найти все такие .txt файлы в текущем каталоге и во всех его подкаталогах , используйте:

 $ grep -rn '^[[:space:]]*=' --include '*.txt' subdir/another.txt:1: =putSomething here; file.txt:1: =putSomething here; 

Заметки

  1. find и xargs здесь не нужны. С параметром -r grep выполняет рекурсивный поиск по подкаталогам.

  2. --include '*.txt' ограничивает grep файлами, соответствующими glob *.txt .

  3. ^ совпадает в начале строки. [[:space:]]* соответствует нулевому или более пробельному символу. = соответствует знаку равенства. В регулярных выражениях POSIX нет ничего особенного относительно = поэтому его можно рассматривать как любой другой символ.

  4. Завершение регулярного выражения grep с .*$ Не меняет, какие строки совпадают. .*$ совпадает либо с любыми символами, либо без символов. Единственная причина для использования .*$ – изменить то, что выделяет grep как согласованный текст.

Строка, начинающаяся с = переводит в regex ^= .

Затем команда find:

 find . -name "*.txt" | xargs grep '^=' 

Или, лучше (избегайте бесполезного использования xargs ):

 find . -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} + 

(здесь, из-за окончания + , только один grep выполняется для кучи файлов)

Пробовал команду ниже и, похоже, сработал.

 grep -rn '^ *=' **/*txt 

В качестве альтернативы рекурсивным grep и xargs :

 $ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print 

Это будет выглядеть в /dir (и ниже) для всех обычных файлов, имена которых соответствуют данному шаблону. Для каждого такого файла, если grep -q '^[[:space:]]*=' выходит с нулевым статусом выхода (шаблон был сопоставлен где-то в файле), то выводится его имя.

Или, если вы просто хотите увидеть сами линии:

 $ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+' 

+ В конце будет подавать как можно больше имен файлов для каждого вызова в grep при использовании ; так как в моем первом примере будет подаваться только один файл за раз.

  • Скопируйте до определенного многострочного шаблона
  • ls и команда find, исключая определенный каталог
  • Grep и отсортировать несколько несортированных вещей в нескольких строках (в одном документе)
  • Как найти файлы, содержащие две строки в разных строках
  • Как совместить строку, содержащую символ «$» с grep?
  • Извлечение списка шаблонов, которые выводятся из другой команды
  • Сравнить awk vs. grep
  • шаблон поиска grep в нескольких файлах и вывод в разные файлы
  • удалять файлы на основе diff двух текстовых файлов
  • Найдите все строки, которые следуют шаблону, и начните с символа
  • Ошибка фиксации сигнала 13 (SIGPIPE) для поиска и grep-конвейера
  • Linux и Unix - лучшая ОС в мире.