Для этого дан вход:
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
Я хочу этот вывод:
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one
Получение целых строк содержит только три повторяющихся слова «это». (совпадение без учета регистра)
text-processing
αғsнιη
источник
источник
$RANDOM_LANGUAGE
- кто-нибудь сможет найти решение в этом.Ответы:
В
perl
, заменитьthis
на себя без учета регистра и посчитать количество замен:Вместо этого используется количество совпадений :
Если у вас есть GNU awk, очень простой способ:
Количество полей будет на один больше количества разделителей.
источник
Предполагая, что ваш исходный файл - tmp.txt,
Левый grep выводит все строки, которые не имеют 4 или более регистрозависимых вхождений «this» в tmp.txt.
Результат передается в правый grep, который выводит все строки с 3 или более вхождениями в левом результате grep.
Обновление: благодаря @Muru, вот лучшая версия этого решения,
замените 4 на n + 1 и 3 на n.
источник
grep
должно закончиться*
.this
.grep -iv '.*this.*this.*this.*this.*' tmp.txt | grep -i '.*this.*this.*this.* |grep -iv '.*this.*this.'
grep -Eiv '(.*this){4,}' | grep -Ei '(.*this){3}'
- это может сделать его практичным для N = 50.В Python это сделало бы работу:
выходы:
Или для чтения из файла с файлом в качестве аргумента:
Вставьте скрипт в пустой файл, сохраните его как
find_3.py
, запустите его командой:Конечно, слово «это» может быть заменено любым другим словом (или другой строкой или разделом строки), а число вхождений в строке может быть установлено на любое другое значение в строке:
редактировать
Если файл будет большим (сотни тысяч / миллионы строк), приведенный ниже код будет быстрее; он читает файл в строке вместо того, чтобы загружать файл сразу:
источник
Вы можете поиграть немного с
awk
этим:Это возвращает:
объяснение
Что мы делаем, так это определяем разделитель полей для
this
себя. Таким образом, в строке будет столько полей +1, сколько разthis
появится слово .Чтобы сделать его нечувствительным к регистру, мы используем
IGNORECASE = 1
. См. Ссылку: Чувствительность к регистру при сопоставлении .Тогда нужно просто сказать,
NF==4
чтобы все эти строки былиthis
ровно трижды. Больше кода не требуется, поскольку{print $0}
(то есть печать текущей строки) - это поведение по умолчанию,awk
когда выражение вычисляется вTrue
.источник
Предполагая, что строки хранятся в файле с именем
FILE
:источник
sed ...
команду и добавить-o
опциюgrep -oi ...
вместо.$(grep -ic "this" <<<"$line")
-c
опция будет подсчитывать количество строк, которые соответствуют «this», а не количеству «this» слов в каждой строке.-l
и-w
быть эквивалентен в этом случае?Если вы в Vim:
Это будет просто печатать согласованные линии.
источник
Рубиновое однострочное решение:
Работает довольно просто: мы перенаправляем файл в stdin ruby, ruby получает строку из stdin, очищает ее с помощью
chomp
иdowncase
иscan().count
дает нам количество вхождений подстроки.источник