Estou tentando obter o número de correspondências (neste caso, ocorrências de {
ou }
) em cada linha de um arquivo .tex.
Eu sei que a -o
bandeira retorna apenas a correspondência, mas retorna cada correspondência em uma nova linha, mesmo combinada com a -n
bandeira. Eu não sei de nada que eu possa passar para contar as repetições. O -c
sinalizador retorna apenas o número total de correspondências no arquivo inteiro - talvez eu possa canalizar uma linha de cada vez para grep?
sort
não é estritamente necessário como saída do grep é classificada pelo número da linha, mas eu acho que é uma boa prática antesuniq
.regex
porque o regex é a parte mais fácil.sort -n
? Ele não sai na ordem dos números de linha, afinal?sort -n
não é necessário. Obrigado.Depois de ler várias soluções, acho que essa é a abordagem mais fácil para o problema:
fonte
grep -o "matchingString" <<< $i | wc -l
.Está usando
grep
um requisito? Aqui está uma alternativa:As
sed
tiras de todas as outras do que caracteres{
e}
(isto é, deixando apenas{
e}
caracteres), e, em seguida, asawk
contagens dos caracteres em cada linha (que são apenas os{
e}
caracteres). Para suprimir linhas sem correspondências,Observe que minha solução assume (requer) que as strings que você está procurando são caracteres únicos. A resposta de Moebius é mais facilmente adaptada a cadeias de caracteres múltiplos. Além disso, nenhuma das nossas respostas exclui ocorrências citadas ou escapadas dos caracteres / sequências de interesse; por exemplo,
seria considerado como contendo quatro caracteres entre chaves.
fonte
grep
não era realmente um requisito, era justamente onde comecei a procurar uma solução, porque isso me proporcionou algo próximo. Eu nunca precisei do awk, por isso, se não tivesse usado a resposta acima, teria usado isso como uma chance de experimentar - ainda posso. O que não consegui esclarecer (mas isso não afeta nenhuma das respostas) é que eu queria executar o script uma vez por colchete, para me ajudar a rastrear uma incompatibilidade (na fonte LaTeX, aqui para uma tabela) em que a maioria dos pares ocorre. uma única linha.sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'
, onde ossed
pares de faixas (correspondentes). Se você tiver pares aninhados, usesed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …
, repetindo os/{[^{}]*}//g
número de vezes que seu aninhamento mais profundo.