Анализировать все строки определенной длины?

В конфигурации ядра ( make config , make menuconfig и т. Д.) Вам необходимо включить CONFIG_MODULE_UNLOAD :

  • Когда CONFIG_MODULE_UNLOAD установлено, ядро ​​считает ссылки, так как вы можете выгрузить модуль только в том случае, если на него нет ссылок.

  • Если CONFIG_MODULE_UNLOAD не установлен, ядру не нужно подсчитывать количество ссылок на модуль, и оно всегда возвращает -2 в качестве значения маркера.

Первоначально этот ответ пришел с форумов Gentoo .

2
06.01.2019, 03:09
4 ответа

Если у вас есть GNUgrep(по умолчанию в Linux ), вы можете сделать:

grep -Po '(^|\s)\S{64}(\s|$)' file

-Pвключает Perl-совместимые регулярные выражения, которые дают нам\b(слова -границы)\S(не -пробелы )и{N}(находят ровно N символов ), а -oозначает «печатать только совпадающую часть строки. Затем мы ищем участки не -пробела длиной ровно 64 символа, которые находятся либо в начале строки (^), либо после пробела('s)и которые заканчиваются либо в конце строки ($), либо другим пробельным символом.

Обратите внимание, что результат будет включать любые пробельные символы в начале и в конце строки, поэтому, если вы хотите продолжить синтаксический анализ, вы можете использовать это вместо этого:

grep -Po '(^|\s)\K\S{64}(?=\s|$)'

Это будет искать пробельный символ или начало строки (\s|^), затем отбрасывать его \Kи затем искать 64 не -пробельных символа, за которыми следует ((?=foo)называется " lookahead " и не будет включаться в соответствие )ни символа пробела, ни конца строки.

3
27.01.2020, 21:49

Если вы хотите найти все слова длиной 64 из /path/to/file, вы можете использовать

tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'

Это заменяет все не -буквенно-цифровые символы символами новой строки, поэтому каждое слово находится на отдельной строке. Затем он фильтрует этот результат, чтобы включить только слова длины 64.

6
27.01.2020, 21:49

Если вы хотите найти 256 -битовое число в шестнадцатеричной форме (64 символа из диапазона 0-9иA-F--одного из форматов, в которых может появиться закрытый ключ биткойна ), это должно делать:

egrep -aro '\<[A-F0-9]{64}\>' files and dirs...

Добавьте опцию -iили также включите диапазон a-f, если некоторые клавиши написаны строчными буквами.

Для общей проблемы поиска наборов символов из одного класса, имеющих заданную длину, вам лучше использовать регулярные выражения pcre, которые можно использовать с GNU grep с опцией -P. Например, чтобы найти ряды прописных букв из любого набора символов, минимальной длины 2 и максимальной длины 4, и которые разделены символами, которые не являются прописными буквами:

echo ÁRVÍZtűrő tükörFÚRÓgép |
   LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
FÚRÓ

Замените \p{Lu}на \p{Ll}для строчных букв, \Sдля не -пробелов и т. д. Полный список см. здесь и здесь .

(?<!...)и (?!...)являются отрицательными взглядами назад и вперед нулевой -шириной утверждениями; например. (?<!<)\w(?!>)будет соответствовать символу «слово», если он не заключен в скобки <и >. Утверждение \<нулевой -ширины из viможет быть реализовано с помощью (?<!\w)(?=\w).

7
27.01.2020, 21:49

Похоже, что grep — правильный инструмент для «поиска» строки. Осталось определить такую ​​строку с помощью регулярного выражения. Первая проблема заключается в определении границ слова. Это не так просто, как «пробел», поскольку a book, a lampиспользует ,в качестве разделителя слов, в той же концепции многие другие символы или даже начало или конец строки могут действовать как разделитель слов. В GNU grep есть несколько разделителей слов:

  • \<начало слова.
  • \>конец слова.
  • \bграница слова.

Все они предполагают, что слово представляет собой последовательность из [a-zA-Z0-9_]символов. Если вас это устраивает, это регулярное выражение может работать:

 grep -o '\<.\{64\}\>' file

Если бы вы могли использовать расширенное регулярное выражение, \можно было бы уменьшить:

 grep -oE '\<.{64}\>' file

Выбирает от «начала слова» (\<), 64({64})символов(.)до «конца слова»(\>)и печатает только совпадающие(-o)части.

Однако точка(.)будет соответствовать любому символу , что может быть слишком много.

Если вы хотите быть более строгим при выборе (шестнадцатеричных цифр ), используйте:

 grep -oE '\<[0-9a-fA-F]{64}\>' file

Это позволит использовать шестнадцатеричные цифры в нижнем регистре или в верхнем регистре. Но если вы действительно хотите быть строгим, так как некоторые не -символы ASCII могут быть включены, используйте:

 LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file

Некоторые реализации grep (как grep -P )не имеют «начала слова» или «конца слова» (, как \<и \>), но имеют «границу слова». "(как\b):

grep -oP '\b[0-9a-fA-F]{64}\b' file

Некоторые языки принимают границы слов POSIX [[:<:]]и [[:>:]], но не perl и только из PCRE 8.34 .

И существует гораздо больше разновидностей "границы слов" .

2
27.01.2020, 21:49

Теги

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