Estoy tratando de obtener el número de coincidencias (en este caso, ocurrencias de {
o }
) en cada línea de un archivo .tex.
Sé que la -o
bandera solo devuelve la coincidencia, pero devuelve cada coincidencia en una nueva línea, incluso combinada con la -n
bandera. No sé de nada con lo que pueda canalizar esto para contar las repeticiones. La -c
bandera solo devuelve el número total de coincidencias en todo el archivo, ¿tal vez podría canalizar una línea a la vez para grep?
sort
es estrictamente necesario ya que la salida de grep está ordenada por número de línea, pero supongo que es una buena práctica antesuniq
.regex
porque la expresión regular es la parte fácil.sort -n
? ¿No sale en orden de número de línea de todos modos?sort -n
no es necesario. Gracias.Después de leer varias soluciones, creo que este es el enfoque más fácil para el problema:
fuente
grep -o "matchingString" <<< $i | wc -l
.¿Está usando
grep
un requisito? Aquí hay una alternativa:Las
sed
tiras fuera todos los caracteres distintos de{
y}
(es decir, dejando sólo{
y}
caracteres), y luego losawk
cuenta los caracteres en cada línea (que son sólo las{
y}
caracteres). Para suprimir líneas sin coincidencias,Tenga en cuenta que mi solución asume (requiere) que las cadenas que está buscando son caracteres individuales. La respuesta de Moebius se adapta más fácilmente a cadenas de caracteres múltiples. Además, ninguna de nuestras respuestas excluye las ocurrencias citadas o escapadas de los caracteres / cadenas de interés; p.ej,
se consideraría que contiene cuatro caracteres de llaves.
fuente
grep
en realidad no era un requisito, fue justo donde comencé a buscar una solución, porque me dio algo cercano. Nunca he tenido necesidad de awk, así que si no hubiera usado la respuesta anterior, habría usado esto como una oportunidad para experimentar, todavía puedo. Lo que no pude dejar claro (pero no afecta a ninguna de las respuestas) es que quería ejecutar el script una vez por paréntesis, para ayudarme a rastrear una falta de coincidencia (en la fuente LaTeX, aquí para una tabla) donde ocurren la mayoría de los pares en Una sola línea.sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'
, donde lassed
tiras se emparejan. Si tiene pares anidados, usesed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …
, repitiendos/{[^{}]*}//g
tantas veces como su anidación más profunda.