Функция main
— это особенность языка C. Как именно он преобразуется в компьютерную инструкцию для ЦП, чтобы «начать здесь», в основном является деталью реализации компилятора. На «голом железе» часто можно просто положиться на то, что аппаратное обеспечение начнет выполнение с определенного адреса памяти при первой загрузке. Ранние версии Linux зависели от a. простой загрузчик x86; сегодня эту роль обычно выполняет Grub. Это поведение, в свою очередь, зависит от соглашений прошивки BIOS. Но на самом деле на каждом уровне у вас есть часть компьютерной архитектуры с соглашением о том, как запускать программу.
grep -E "(foo.*){2}" file
Это соответствует не менее 2 раз в каждой строке файла или вывода, вы можете указать минимальное количество совпадений.
grep "foo.*foo" file.txt
Это вернет только строки, в которых foo
встречается два или более раз. Он не будет возвращать строки, где он появляется только один раз.
Вышеприведенное в большинстве случаев будет работать без кавычек, но в других случаях, когда в каталоге есть имена файлов, которые соответствуют глобусу, например foo.barfoo
, необходимо заключать регулярное выражение в кавычки, поэтому я отредактировал мой ответ, чтобы включить двойные кавычки.
Если вы хотите, чтобы все строки соответствовали любой строке дважды:
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