Pour cette entrée donnée:
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
Je veux cette sortie:
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
L'obtention de lignes entières ne contient que trois mots "this" répétés. (correspondance insensible à la casse)
text-processing
αғsнιη
la source
la source
$RANDOM_LANGUAGE
- quelqu'un pourra y trouver une solution.Réponses:
Dans
perl
, remplacezthis
par lui-même sans tenir compte de la casse et comptez le nombre de remplacements:Utilisez plutôt un nombre de correspondances :
Si vous avez GNU awk, une manière très simple:
Le nombre de champs sera un de plus que le nombre de séparateurs.
la source
En supposant que votre fichier source est tmp.txt,
Le grep gauche affiche toutes les lignes qui n'ont pas 4 occurrences ou plus insensibles à la casse de "this" dans tmp.txt.
Le résultat est dirigé vers le grep droit, qui génère toutes les lignes avec 3 occurrences ou plus dans le résultat grep gauche.
Mise à jour: grâce à @Muru, voici la meilleure version de cette solution,
remplacer 4 par n + 1 et 3 par n.
la source
grep
doit se terminer*
.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}'
- cela pourrait le rendre pratique pour N = 50.En python, cela ferait l'affaire:
les sorties:
Ou pour lire à partir d'un fichier, avec le fichier comme argument:
Collez le script dans un fichier vide, enregistrez-le sous
find_3.py
, exécutez-le avec la commande:Bien sûr, le mot "ceci" peut être remplacé par n'importe quel autre mot (ou toute autre chaîne ou section de ligne), et le nombre d'occurrences par ligne peut être défini sur n'importe quelle autre valeur de la ligne:
Éditer
Si le fichier était volumineux (centaines de milliers / millions de lignes), le code ci-dessous serait plus rapide; il lit le fichier par ligne au lieu de charger le fichier à la fois:
la source
Vous pouvez jouer un peu avec
awk
pour ça:Cela renvoie:
Explication
Ce que nous faisons est de définir le séparateur de champ pour
this
lui-même. De cette façon, la ligne aura autant de champs +1 que de fois où le motthis
apparaît.Pour le rendre insensible à la casse, nous utilisons
IGNORECASE = 1
. Voir référence: Sensibilité à la casse dans l'appariement .Ensuite, il suffit de dire
NF==4
que toutes ces lignes ontthis
exactement trois fois. Aucun code supplémentaire n'est nécessaire, car{print $0}
(c'est-à-dire, imprimer la ligne actuelle) est le comportement par défautawk
lorsqu'une expression est évaluéeTrue
.la source
En supposant que les lignes sont stockées dans un fichier nommé
FILE
:la source
sed ...
commande et ajouter une-o
option pour à lagrep -oi ...
place.$(grep -ic "this" <<<"$line")
-c
option comptera le nombre de lignes correspondant à "ce" et non le nombre de "ce" mots dans chaque ligne.-l
et-w
serait-il équivalent dans ce cas?Si vous êtes à Vim:
Cela imprimera simplement les lignes correspondantes.
la source
Solution Ruby one-liner:
Fonctionne d'une manière assez simple: nous redirigeons le fichier vers stdin de ruby, ruby obtient la ligne de stdin, le nettoie avec
chomp
etdowncase
, etscan().count
nous donne le nombre d'occurrences d'une sous-chaîne.la source