Dla tego podanego wejścia:
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
Chcę tego wyniku:
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
Uzyskiwanie całych wierszy zawiera tylko trzy powtórzone „to” słowa. (dopasowanie bez rozróżniania wielkości liter)
text-processing
αғsнιη
źródło
źródło
$RANDOM_LANGUAGE
- ktoś będzie w stanie znaleźć rozwiązanie.Odpowiedzi:
W
perl
zamień nathis
siebie bez rozróżniania wielkości liter i policz liczbę zamienników:Korzystanie licznik meczów zamiast:
Jeśli masz GNU awk, bardzo prosty sposób:
Liczba pól będzie o jedną więcej niż liczba separatorów.
źródło
Zakładając, że plik źródłowy to tmp.txt,
Lewy grep wyprowadza wszystkie wiersze, które nie zawierają 4 lub więcej wystąpień „this” bez rozróżniania wielkości liter w tmp.txt.
Wynik jest przesyłany do prawego grep, który wyprowadza wszystkie linie z 3 lub więcej wystąpieniami w wyniku lewego grep.
Aktualizacja: Dzięki @Muru jest lepsza wersja tego rozwiązania,
zamień 4 na n + 1 i 3 na n.
źródło
grep
musi się zakończyć*
.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}'
- może to być praktyczne dla N = 50.W Pythonie wykona to zadanie:
wyjścia:
Lub wczytać z pliku z plikiem jako argumentem:
Wklej skrypt do pustego pliku, zapisz go jako
find_3.py
, uruchom go poleceniem:Oczywiście słowo „to” można zastąpić dowolnym innym słowem (lub innym ciągiem lub sekcją wiersza), a liczbę wystąpień w wierszu można ustawić na dowolną inną wartość w wierszu:
Edytować
Jeśli plik byłby duży (setki tysięcy / miliony linii), poniższy kod byłby szybszy; czyta plik w wierszu zamiast ładować plik naraz:
źródło
Możesz się z
awk
tym pograć :Zwraca to:
Wyjaśnienie
To, co robimy, to zdefiniowanie separatora pól dla
this
siebie. W ten sposób linia będzie miała tyle pól +1, ile razythis
pojawi się słowo .Aby uniknąć rozróżniania wielkości liter, używamy
IGNORECASE = 1
. Patrz odniesienie: Rozróżnianie wielkości liter w dopasowywaniu .Zatem wystarczy powiedzieć,
NF==4
że wszystkie te wiersze mająthis
dokładnie trzy razy. Nie jest już potrzebny żaden kod, ponieważ{print $0}
(to znaczy wydrukuje bieżący wiersz) jest domyślnym zachowaniem,awk
gdy wyrażenie oceniaTrue
.źródło
Zakładając, że wiersze są przechowywane w pliku o nazwie
FILE
:źródło
sed ...
polecenie i zamiast tego dodać-o
opcjęgrep -oi ...
.$(grep -ic "this" <<<"$line")
-c
opcja zlicza liczbę wierszy pasujących do „tego”, a nie liczby „tego” słowa w każdej linii.-l
i-w
będzie równoważne?Jeśli jesteś w Vimie:
To po prostu wydrukuje dopasowane linie.
źródło
Rubinowe rozwiązanie jednowarstwowe:
Działa w dość prosty sposób: przekierowujemy plik do standardowego ruby, ruby pobiera linię ze standardowego, oczyszcza go za pomocą
chomp
idowncase
, iscan().count
daje nam liczbę wystąpień podłańcucha.źródło