En script bash,
Tengo una cadena que contiene varias palabras separadas por uno o más espacios. es decir:
Name Age Sex ID Address
Si quiero encontrar alguna de las palabras, por ejemplo, quiero encontrar el índice de la palabra "Edad", ¿cómo puedo hacerlo?
¿Hay algún comando que devuelva el número de índice de la palabra que quiero directamente?
Gracias.
Respuestas:
Bash realiza la división de palabras en cadenas por sí mismo; de hecho, la mayoría de las veces, evitando que sea un problema, y la razón por la cual la cita es tan importante. Es fácil aprovechar eso en su caso: simplemente coloque su cadena en una matriz sin citarla; bash usará la división de palabras para separar los elementos individuales. Suponiendo que su cadena se almacena en la variable
$str
,devolverá una matriz de 5 elementos. Su índice de matriz es su índice de palabras (contando desde 0, como en la mayoría de los lenguajes de programación y scripts), es decir, se accede a "Edad" usando
o, si necesita encontrar el índice del elemento por contenido, repita la matriz, es decir
fuente
Reemplazar * Edad con Edad: esto eliminará cualquier cosa antes de "Edad":
Obtén cualquier cosa antes de "Age"
Obtenga la longitud de esa cadena (que es el índice de "Edad"):
fuente
export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}
imprime 'advertir error'Si no tiene que usar estrictamente bash, pero puede usar otros programas comúnmente encontrados en sistemas con bash, entonces podría usar algo como esto:
Python comienza su indexación de cadenas en cero, por lo tanto, agregué +1 al final del comando.
fuente
Puedes usar la expresión regular nativa de bash
Salida
fuente
Nota : Suponiendo aquí que por índice quiere decir que quiere saber qué palabra es (a partir de 0), no en qué carácter de la cadena comienza la palabra. Otras respuestas abordan lo último.
No es que yo sepa, pero puedes hacer uno. Dos trucos:
Código:
fuente
Pruebe el siguiente jael oneliner en un shell (use javascript shell):
O con un documento aquí:
fuente
Encontré una solución que funciona bien.
Funciona de manera similar a la función indexOf () en Java que devuelve la primera aparición de una cadena de entrada.
Encontré esta solución aquí http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (última publicación). Este chico me salvó el día. Crédito para él.
Una forma más rápida si desea hacer una subcadena desde el primer índice de.
/programming/10349102/shell-script-substring-from-first-indexof-substring
fuente
Si coreutils están disponibles, puede hacerlo de la siguiente manera:
Por solicitud de MariusMatutiae, agrego una explicación de cómo funciona esta operación de 3 pasos:
Para referencias, consulte:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html (vaya a: "Expansión variable / Reemplazo de subcadenas")
http://www.gnu.org/software/coreutils/manual/coreutils .html (vaya a: "El comando de corte" y "invocación de wc"
fuente
Una combinación de dos respuestas dadas anteriormente, utilizando matrices de bash puro y reemplazo de subcadenas.
La idea es obtener una cadena de todas las palabras antes de la que desea, luego contar el número de palabras en esa subcadena convirtiéndola en una matriz.
Por supuesto, la edad se puede almacenar en otra variable
needle
, luego usar${haystack%$needle*}
. Espere problemas si la palabra que busca es un subconjunto de otra palabra, en cuyo caso la respuesta de kopischke sigue funcionando.fuente