Für diese gegebene Eingabe:
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
Ich möchte diese Ausgabe:
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
Das Abrufen ganzer Zeilen enthält nur drei wiederholte "dieses" Wörter. (Groß- und Kleinschreibung wird nicht berücksichtigt)
text-processing
αғsнιη
quelle
quelle
$RANDOM_LANGUAGE
- jemand wird in der Lage sein, eine Lösung darin zu finden.Antworten:
In
perl
Ersetzenthis
mit sich selbst fall unsensibel und die Anzahl der Ersatz zählen:Verwenden Sie stattdessen eine Anzahl von Übereinstimmungen :
Wenn Sie GNU awk haben, ein sehr einfacher Weg:
Die Anzahl der Felder ist eins mehr als die Anzahl der Trennzeichen.
quelle
Angenommen, Ihre Quelldatei ist tmp.txt,
Das linke grep gibt alle Zeilen aus, bei denen in tmp.txt nicht 4 oder mehr Vorzeichen ohne Berücksichtigung der Groß- und Kleinschreibung vorhanden sind.
Das Ergebnis wird an den rechten grep weitergeleitet, der alle Zeilen mit 3 oder mehr Vorkommen im linken grep-Ergebnis ausgibt.
Update: Dank @Muru ist hier die bessere Version dieser Lösung:
Ersetzen Sie 4 durch n + 1 und 3 durch n.
quelle
grep
muss mit enden*
.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}'
- Dies könnte es für N = 50 praktisch machen.In Python würde dies den Job machen:
Ausgänge:
Oder um aus einer Datei mit der Datei als Argument einzulesen:
Fügen Sie das Skript in eine leere Datei ein, speichern Sie es unter
find_3.py
und führen Sie es mit dem folgenden Befehl aus:Natürlich kann das Wort "this" durch ein anderes Wort (oder einen anderen String oder Zeilenabschnitt) ersetzt werden, und die Anzahl der Vorkommen pro Zeile kann auf einen anderen Wert in der Zeile gesetzt werden:
Bearbeiten
Wenn die Datei groß wäre (Hunderttausende / Millionen Zeilen), wäre der folgende Code schneller. Es liest die Datei pro Zeile, anstatt sie sofort zu laden:
quelle
Sie können ein bisschen damit spielen
awk
:Dies gibt zurück:
Erläuterung
Wir definieren das Feldtrennzeichen für
this
sich. Auf diese Weise hat die Zeile so viele Felder +1, wie das Wortthis
erscheint.Um die Groß- und Kleinschreibung nicht zu berücksichtigen, verwenden wir
IGNORECASE = 1
. Siehe Referenz: Groß- / Kleinschreibung beim Matching .Dann ist es nur eine Frage der Aussage
NF==4
, alle diese Zeilenthis
genau dreimal zu haben. Es wird kein Code mehr benötigt, da{print $0}
(dh die aktuelle Zeile drucken) das Standardverhalten ist,awk
wenn ein Ausdruck ausgewertet wirdTrue
.quelle
Angenommen, die Zeilen werden in einer Datei mit dem Namen gespeichert
FILE
:quelle
sed ...
Befehl entfernen und stattdessen eine-o
Option für hinzufügengrep -oi ...
.$(grep -ic "this" <<<"$line")
-c
Option zählt die Anzahl der Zeilen , die mit "this" übereinstimmen, nicht die Anzahl der "this" -Wörter in jeder Zeile.-l
und-w
wäre in diesem Fall nicht gleichwertig?Wenn Sie in Vim sind:
Dadurch werden nur übereinstimmende Zeilen gedruckt.
quelle
Ruby Einzeiler-Lösung:
Funktioniert ganz einfach: Wir leiten Dateien in Rubys Standard um, Ruby erhält die Zeile von Standard, bereinigt sie mit
chomp
unddowncase
undscan().count
gibt die Anzahl der Vorkommen eines Teilstrings an.quelle