J'essaie d'obtenir le nombre de correspondances (dans ce cas, les occurrences de {
ou }
) dans chaque ligne d'un fichier .tex.
Je sais que le -o
drapeau ne renvoie que le match, mais il renvoie chaque match sur une nouvelle ligne, même combinée avec le -n
drapeau. Je ne sais rien de ce que je pourrais faire passer à travers pour compter les répétitions. L' -c
indicateur ne renvoie que le nombre total de correspondances dans l'ensemble du fichier - peut-être que je pourrais diriger une ligne à la fois vers grep?
sort
n'est pas strictement nécessaire car la sortie de grep est triée par numéro de ligne, mais je suppose que c'est une bonne pratique avantuniq
.regex
car le regex est la partie facile.sort -n
? Cela ne sort-il pas dans l'ordre des numéros de ligne de toute façon?sort -n
n'est pas nécessaire. Merci.Après avoir lu diverses solutions, je pense que c'est l'approche la plus simple au problème:
la source
grep -o "matchingString" <<< $i | wc -l
.Utilise
grep
une exigence? Voici une alternative:Le
sed
supprime tous les caractères autres que{
et}
(c'est-à-dire ne laissant que les caractères{
et}
), puis leawk
compte les caractères sur chaque ligne (qui ne sont que les caractères{
et}
). Pour supprimer les lignes sans correspondance,Notez que ma solution suppose (nécessite) que les chaînes que vous recherchez sont des caractères uniques. La réponse de Moebius est plus facilement adaptée aux chaînes multi-caractères. De plus, aucune de nos réponses n'exclut les occurrences citées ou échappées des caractères / chaînes d'intérêt; par exemple,
serait considéré comme contenant quatre accolades.
la source
grep
Ce n'était pas vraiment une exigence, c'était juste là où j'ai commencé à chercher une solution, car cela m'a donné quelque chose de proche. Je n'ai jamais eu besoin de awk, donc si je n'avais pas utilisé la réponse ci-dessus, j'aurais utilisé cela comme une chance d'expérimenter - je peux encore. Ce que je n'ai pas précisé (mais cela n'affecte pas l'une ou l'autre réponse), c'est que je voulais exécuter le script une fois par parenthèse, pour m'aider à trouver une disparité (dans la source LaTeX, ici pour un tableau) où la plupart des paires se produisent dans une seule ligne.sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'
, où lessed
bandes hors (appariées) paires. Si vous avez des paires imbriquées, utilisezsed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …
, en répétants/{[^{}]*}//g
autant de fois que votre imbrication la plus profonde.