Строки Grep, дважды совпадающие с шаблоном

Функция main— это особенность языка C. Как именно он преобразуется в компьютерную инструкцию для ЦП, чтобы «начать здесь», в основном является деталью реализации компилятора. На «голом железе» часто можно просто положиться на то, что аппаратное обеспечение начнет выполнение с определенного адреса памяти при первой загрузке. Ранние версии Linux зависели от a. простой загрузчик x86; сегодня эту роль обычно выполняет Grub. Это поведение, в свою очередь, зависит от соглашений прошивки BIOS. Но на самом деле на каждом уровне у вас есть часть компьютерной архитектуры с соглашением о том, как запускать программу.

1
02.07.2020, 18:58
3 ответа
grep -E "(foo.*){2}" file

Это соответствует не менее 2 раз в каждой строке файла или вывода, вы можете указать минимальное количество совпадений.

7
18.03.2021, 23:22
grep "foo.*foo" file.txt

Это вернет только строки, в которых fooвстречается два или более раз. Он не будет возвращать строки, где он появляется только один раз.

Вышеприведенное в большинстве случаев будет работать без кавычек, но в других случаях, когда в каталоге есть имена файлов, которые соответствуют глобусу, например foo.barfoo, необходимо заключать регулярное выражение в кавычки, поэтому я отредактировал мой ответ, чтобы включить двойные кавычки.

0
18.03.2021, 23:22

Если вы хотите, чтобы все строки соответствовали любой строке дважды:

grep '\(.\{1,\}\).*\1'

Вы можете изменить длину для соответствия, изменив1,:

seq 10000 | grep '\(.\{2,\}\).*\1'

Здесь используется базовое регулярное выражение(BRE)и, следовательно, оно должно работать на любом POSIX-совместимом grep.

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

grep -E '(..*?).*?\1'

На графике показано время выполнения в секундах для прогонов с не -жадным алгоритмом и без него на 100 строках каждых n чисел (~длины строки ).

greedy() {
  a=`seq $1`;
  yes $a | head -n 100 | grep '\(.\{1,\}\).*\1' | LC_ALL=C wc;
}
nongreedy() {
  a=`seq $1`;
  yes $a | head -n 100 | grep -E '(..*?).*?\1' | LC_ALL=C wc;
}
export -f greedy
export -f nongreedy
parallel --jl my.log {2} {1}000 {2} ::: {1..100} ::: greedy nongreedy

enter image description here

1
18.03.2021, 23:22

Теги

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