Ich versuche, die Anzahl der Übereinstimmungen (in diesem Fall Vorkommen von {
oder }
) in jeder Zeile einer .tex-Datei zu ermitteln.
Ich weiß, dass das -o
Flag nur die Übereinstimmung zurückgibt, aber es gibt jede Übereinstimmung in einer neuen Zeile zurück, sogar in Kombination mit dem -n
Flag. Ich kenne nichts, durch das ich die Wiederholungen zählen könnte. Das -c
Flag gibt nur die Gesamtzahl der Übereinstimmungen in der gesamten Datei zurück. Vielleicht könnte ich eine Zeile nach der anderen an grep leiten?
sort
ist nicht unbedingt notwendig, da die Ausgabe von grep nach Zeilennummer sortiert ist, aber ich denke, es hat sich zuvor bewährtuniq
.regex
da der reguläre Ausdruck der einfache Teil ist.sort -n
? Kommt es nicht trotzdem in der Reihenfolge der Zeilennummern heraus?sort -n
ist nicht notwendig. Vielen Dank.Nach dem Lesen verschiedener Lösungen denke ich, dass dies der einfachste Ansatz für das Problem ist:
quelle
grep -o "matchingString" <<< $i | wc -l
.Verwendet
grep
eine Anforderung? Hier ist eine Alternative:Das
sed
löscht alle Zeichen außer{
und}
(dh nur{
und}
-Zeichen lassen) undawk
zählt dann die Zeichen in jeder Zeile (die nur die{
und}
-Zeichen sind). So unterdrücken Sie Zeilen ohne Übereinstimmungen:Beachten Sie, dass meine Lösung davon ausgeht (erfordert), dass die Zeichenfolgen, nach denen Sie suchen, einzelne Zeichen sind. Möbius 'Antwort lässt sich leichter an Zeichenfolgen mit mehreren Zeichen anpassen. Außerdem schließt keine unserer Antworten das Auftreten von Zeichen / Zeichenketten von Interesse in Anführungszeichen oder ohne Escapezeichen aus. z.B,
Es wird angenommen, dass es vier geschweifte Klammern enthält.
quelle
grep
war nicht wirklich eine Anforderung, es war nur, wo ich anfing, nach einer Lösung zu suchen, weil es mir etwas nahes gab. Ich hatte noch nie ein Bedürfnis nach awk. Hätte ich die obige Antwort nicht verwendet, hätte ich dies als Chance zum Experimentieren genutzt - ich kann es immer noch. Was ich nicht klarstellen konnte (aber es hat keinen Einfluss auf die Antworten), ist, dass ich das Skript einmal pro Klammer ausführen wollte, um eine Nichtübereinstimmung (in der LaTeX-Quelle, hier für eine Tabelle) zu finden, in der die meisten Paare vorkommen eine einzelne Zeile.sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'
, bei dem diesed
Streifen (übereinstimmend) gepaart werden. Wenn Sie geschachtelte Paare habensed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …
, wiederholen Sie dass/{[^{}]*}//g
so oft wie Ihre tiefste Verschachtelung.