¿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
bash
etiqueta si estás pidiendo unash
solució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!
echo
no debe usarse para datos arbitrarios.NOTE:
expr substr
es una extensión de GNU.NOTE: Eso
echo
es redundante y lo hace aún menos confiable. Usoexpr substr + "$string1" 1 2
.NOTE:
expr
volverá 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 devar
desde la "primera posición", sino de la segunda.En POSIX
sh
,"${var%?????}"
está$var
despojado de los últimos 5 caracteres finales (o$var
si$var
contiene menos de 5 caracteres)"${var%"${var#??????????}"}"
es los primeros 10 caracteres de$var
."${var%_*}"
se$var
despoja 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$var
no 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
,bash
ozsh
:"${var:0:10}"
: primeros 10 caracteres de$var
Con
bash
ozsh
:"${var:0:-5}"
: todos menos los últimos 5 caracteres (da un error y sale del script si$var
está configurado pero contiene menos de 5 caracteres, también cuando$var
no está configurado conzsh
).Si necesita
sh
compatibilidad 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
$var
contiene bytes que no pueden formar parte de caracteres válidos, YMMV.fuente
sh
no proporciona una forma integrada de obtener una subcadena de una cadena (por lo que puedo ver), pero conbash
usted 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
for
bucle para los nombres de archivo.Entonces, algo como esto debería ayudar.
fuente
for
con nombres de archivo?printf
ser más seguro. ... yread -r
.for
bucle 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