Digamos que eu tenho uma variável
line="This is where we select from a table."
agora eu quero grep quantas vezes o select ocorre na frase.
grep -ci "select" $line
Eu tentei isso, mas não funcionou. Eu também tentei
grep -ci "select" "$line"
Ainda não funciona. Estou tendo o erro a seguir.
grep: This is where we select from a table.: No such file or directory
...<<<"$line"
. O comandogrep
está esperando um arquivo em vez dissoRespostas:
Ter
grep
lido em sua entrada padrão. Lá vai você, usando um cachimbo ...... ou uma string aqui ...
Além disso, convém substituir espaços por novas linhas antes de grepping:
... ou você pode pedir apenas
grep
para imprimir a correspondência:Isso permitirá que você se livre do resto da linha quando houver uma correspondência.
Edit: Opa, leia um pouco rápido demais, obrigado Marco . Para contar as ocorrências, basta canalizar uma delas para
wc(1)
;)Outra edição feita após o comentário de lzkata , citando
$line
ao usarecho
.fonte
wc
para concluir a tarefa:grep -o <string> <<< "$variable" | wc -l
echo "$line"
a preservar novas linhas existentes em vez de criar queridos comtr
Você não precisa pedir
grep
uma coisa tão simples.Ou como uma função:
Leva 2 ou 3 args. Fornecer mais do que isso distorcerá seus resultados. Você pode usá-lo como:
... que imprime a contagem de ocorrências de
.
in...
se ocorrer pelo menos 2 vezes. Como isso:Se
$_occur
estiver vazio ouunset
quando for chamado, não afetará nenhuma variável de shell ereturn
1 se"$2"
ocorrer em"$1"
menos de"$3"
vezes. Ou, se chamado com apenas dois argumentos, seráreturn
1 apenas se"$2"
não estiver dentro"$1"
. Caso contrário, ele retorna 0.E assim, na sua forma mais simples, você pode fazer:
... que imprime ...
...mas...
... imprimirá ...
Você também pode escrever um pouco diferente e omitir as aspas
$2
na declaração(*"$2"*)
e"${1#*"$2"}"
. Se você fizer isso, poderá usar shell globs para correspondências comosh[io]te
para o teste de correspondência.fonte
bash
edash
/sh
(e provavelmente alguns outros).