Próbuję uzyskać liczbę dopasowań (w tym przypadku wystąpień {
lub }
) w każdej linii pliku .tex.
Wiem, że -o
flaga zwraca tylko dopasowanie, ale zwraca każde dopasowanie w nowej linii, nawet w połączeniu z -n
flagą. Nie wiem nic, co mógłbym przelecieć, żeby policzyć powtórzenia. -c
Flag zwraca tylko łączną liczbę meczów w całym pliku - może mógłbym rura jeden wiersz naraz grep?
sort
jest to absolutnie konieczne, ponieważ wyjście grep jest sortowane według numeru linii, ale myślę, że wcześniej była to dobra praktykauniq
.regex
ponieważ wyrażenie regularne jest łatwą częścią.sort -n
? Czy to zresztą nie wynika z kolejności numerów?sort -n
nie jest to konieczne. Dzięki.Po przeczytaniu różnych rozwiązań wydaje mi się, że jest to najłatwiejsze podejście do problemu:
źródło
grep -o "matchingString" <<< $i | wc -l
.Czy używasz
grep
wymagań? Oto alternatywa:Te
sed
paski spośród wszystkich znaków innych niż{
a}
(czyli, pozostawiając tylko{
i}
znaków), a następnieawk
zlicza znaki na każdej linii (które są tylko{
i}
znaków). Aby pominąć linie bez dopasowań,Zauważ, że moje rozwiązanie zakłada (wymaga), że ciągi, których szukasz, to pojedyncze znaki. Odpowiedź Moebiusa jest łatwiej przystosowana do ciągów wieloznakowych. Ponadto żadna z naszych odpowiedzi nie wyklucza cytowanych lub unikniętych wystąpień znaków / ciągów zainteresowania; na przykład,
byłoby uważane za zawierające cztery znaki nawiasu klamrowego.
źródło
grep
nie było tak naprawdę wymogiem, właśnie tam zacząłem szukać rozwiązania, ponieważ dało mi to coś bliskiego. Nigdy nie potrzebowałem awk, więc gdybym nie użył powyższej odpowiedzi, wykorzystałbym to jako okazję do eksperymentowania - być może nadal. Nie wyjaśniłem (ale nie wpływa to na żadną odpowiedź), że chciałem uruchomić skrypt raz na nawias, aby pomóc mi wyśledzić niedopasowanie (w źródle LaTeX, tutaj dla tabeli), w którym występuje większość par pojedyncza linia.sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'
, w którymsed
pary pasują (dopasowane). Jeśli masz zagnieżdżone pary, użyjsed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …
, powtarzającs/{[^{}]*}//g
tyle razy, ile jest najgłębsze zagnieżdżenie.