¿Cómo puedo referirme a una cadena por índice en sh / bash? Es decir, básicamente dividiéndolo.
Estoy tratando de quitar 5 caracteres de un nombre de archivo. Todos los nombres tienen la estructura: nombre_nr_código. Estoy tratando de eliminar el bit de código 5 alfanumérico. name_nr_Siempre tiene 10 caracteres.
¿Hay algo así como;
for i in * ; do mv "$i" "$i"[:10] ; done

bashetiqueta si estás pidiendo unashsolución?Respuestas:
Tan simple como esto.
(golpetazo)
Voila
Y una explicación de Advanced Bash-Scripting Guide ( Capítulo 10. Manipulación de variables ) , (con NOTEs adicional en línea para resaltar los errores en ese manual):
NOTEfaltan comillas alrededor de expansiones de parámetros!
echono debe usarse para datos arbitrarios.NOTE:
expr substres una extensión de GNU.NOTE: Eso
echoes redundante y lo hace aún menos confiable. Usoexpr substr + "$string1" 1 2.NOTE:
exprvolverá con un estado de salida distinto de cero si la salida es 0 (o -0, 00 ...).Por cierto. El libro está presente en el repositorio oficial de Ubuntu como
abs-guide.fuente
${var:1}no devuelve el valor devardesde la "primera posición", sino de la segunda.En POSIX
sh,"${var%?????}"está$vardespojado de los últimos 5 caracteres finales (o$varsi$varcontiene menos de 5 caracteres)"${var%"${var#??????????}"}"es los primeros 10 caracteres de$var."${var%_*}"se$vardespoja de la cadena más corta que coincide_*al final de$var(foo_bar_baz->foo_bar)."${var%%_*}": coincidencia igual pero más larga en lugar de la coincidencia más corta (foo_bar_baz->foo).foo_bar_:"${var%"${var##*_}"}"(${var##pattern}es lo mismo que${var%%pattern}buscar el patrón al principio y$varno al final).Con
zsh:$var[1,-6]desde el primer personaje hasta el sexto desde el final (así que todos menos los últimos 5).$var[1,10]para los primeros 10 caracteres.Con
ksh,bashozsh:"${var:0:10}": primeros 10 caracteres de$varCon
bashozsh:"${var:0:-5}": todos menos los últimos 5 caracteres (da un error y sale del script si$varestá configurado pero contiene menos de 5 caracteres, también cuando$varno está configurado conzsh).Si necesita
shcompatibilidad con Bourne , es muy difícil hacerlo de manera confiable. Si puede garantizar que el resultado no terminará en caracteres de nueva línea, puede hacer:También tendrá un límite en la longitud de
$var(que varía entre sistemas).En todas esas soluciones, si
$varcontiene bytes que no pueden formar parte de caracteres válidos, YMMV.fuente
shno proporciona una forma integrada de obtener una subcadena de una cadena (por lo que puedo ver), pero conbashusted puede hacerEsto le dará los primeros diez caracteres del valor de la variable
i.El formato general es
${variable:offset:length}.fuente
La mayoría de los shells admiten algún tipo de expansión de parámetros que pueden ayudarlo. En bash, puedes usar
En
dash, las compensaciones no son compatibles, pero puede usar patrones iniciales y finales:fuente
En primer lugar, no use un
forbucle para los nombres de archivo.Entonces, algo como esto debería ayudar.
fuente
forcon nombres de archivo?printfser más seguro. ... yread -r.forbucle del OP estaba bien, excepto tal vez por los desaparecidos--. ¡Puedo ver al menos 10 errores en tus 4 líneas de código! muchas de las cuales son malas prácticas bien conocidas, como suponer que los nombres de los archivos son de una sola línea, usan eco, faltan comillas