No script bash,
Eu tenho uma string que contém várias palavras separadas por um ou mais de um espaço. ou seja:
Name Age Sex ID Address
Se eu quiser encontrar alguma palavra, por exemplo, quero encontrar o índice da palavra "Idade", como posso fazer isso?
Existe algum comando que retornará o número de índice da palavra que eu quero diretamente?
Obrigado.
Respostas:
O Bash realiza a divisão de palavras em strings por si só - na verdade, mais frequentemente do que não, evitando que isso seja um problema, e a razão pela qual a citação é tão importante. É fácil aproveitar isso no seu caso: basta colocar sua string em uma matriz sem citá-la - o bash usará a divisão de palavras para separar os elementos individuais. Assumindo que o seu string é armazenado na variável
$str
,retornará uma matriz de 5 elementos. Seu índice de matriz é o seu índice de palavras (contando desde 0, como na maioria das linguagens de script e de programação), ou seja, "Idade" é acessada usando
ou, se você precisar encontrar o índice do elemento por conteúdo, faça um loop sobre a matriz, ou seja,
fonte
Substitua * Idade por Idade - isso removerá qualquer coisa antes de "Idade":
Consiga qualquer coisa antes de "Idade"
Obtenha o comprimento dessa string (que é o índice de "Age"):
fonte
export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}
impressões 'alertam erros'Se você não precisar usar estritamente o bash, mas puder usar outros programas comumente encontrados em sistemas com o bash, poderá usar algo como isto:
Python inicia sua indexação de string em zero, portanto adicionei +1 ao final do comando.
fonte
Você pode usar o regex nativo do bash
Resultado
fonte
Nota : Assumindo aqui que, por índice, você quer saber qual palavra é (a partir de 0), e não em qual caractere na sequência a palavra começa. Outras respostas abordam o último.
Não que eu saiba, mas você pode fazer um. Dois truques:
Código:
fonte
Experimente o seguinte javascript oneliner em um shell (use javascript shell):
Ou com um documento aqui:
fonte
Encontrei uma solução que funciona bem.
Funciona de maneira semelhante à função indexOf () em Java, que retorna a primeira ocorrência de uma sequência de entrada.
Encontre esta solução aqui http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (última postagem). Esse cara salvou o meu dia. Crédito para ele.
Maneira mais rápida se você deseja fazer substring a partir do primeiro indexof.
/programming/10349102/shell-script-substring-from-first-indexof-substring
fonte
Se o coreutils estiver disponível, você poderá fazê-lo da seguinte maneira:
Por solicitação MariusMatutiae, estou adicionando uma explicação de como esta operação de 3 etapas funciona:
Para referências, verifique:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html (acesse: "Expansão variável / substituição de substring")
http://www.gnu.org/software/coreutils/manual/coreutils .html (acesse: "O comando recortar" e "invocação wc"
fonte
Uma mistura de duas respostas fornecidas anteriormente, usando matrizes de bash puras e substituição de substring.
A idéia é obter uma sequência de todas as palavras antes da que você deseja e, em seguida, conte o número de palavras nessa substring, transformando-a em uma matriz.
É claro que o Age pode ser armazenado em outra variável
needle
e depois usar${haystack%$needle*}
. Espere problemas se a palavra que você procurar for um subconjunto de outra palavra, caso em que a resposta do kopischke ainda está funcionando.fonte