¿Cómo obtener el carácter en una posición dada de una cadena en el script de shell?
shell
shell-script
Tom Brito
fuente
fuente
echo ${var: -2:1}
zsh
ymksh
.La alternativa a la expansión de parámetros es
expr substr
Por ejemplo:
fuente
substr
no está incluido en el expr de FreeBSD, NetBSD u OS X. Esta no es una solución portátil.substr
originalmente no es una extensión GNU. La implementación originalexpr
de PWB Unix vino a finales de los 70 y teníasubstr
(pero no:
).cut -c
Si la variable no contiene nuevas líneas, puede hacer:
salidas:
awk substr
es otra alternativa POSIX que funciona incluso si la variable tiene nuevas líneas:salidas:
printf '%s\n'
es para evitar problemas con los caracteres de escape: /programming//a/40423558/895245 por ejemplo:salidas
\
como se esperaba.Ver también: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Probado en Ubuntu 19.04.
fuente
printf '%s' "$myvar" | cut -c2
no es POSIX ya que la salida deprintf
no es texto a menos que$myvar
termine en un carácter de nueva línea. De lo contrario, se supone que la variable no contiene caracteres de nueva línea, ya quecut
corta cada línea de su entrada.awk
uno sería más eficiente y confiable conawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, eso no funciona para caracteres de varios bytes (lo mismo para mawk u busybox awk)printf 'abc '| cut -c2
está mal porque no\n
(esto no lo sé) o que el comando fallará si myvar tiene líneas nuevas (estoy de acuerdo)?cut
no se especifica si la entrada no es texto (aunquecut
se requieren implementaciones para manejar líneas o longitud arbitraria). La salida deprintf abc
no es texto, ya que no termina en un carácter de nueva línea. En la práctica, dependiendo de la aplicación, si la tubería que acut -c2
, se obtiene ya seab
,b<newline>
o nada en absoluto. Necesitaríaprintf 'abc\n' | cut -c2
obtener un comportamiento especificado por POSIX (que se requiere para la salidab<newline>
)Con
zsh
oyash
, usarías:(en
zsh
, puedes acortarlo aprintf '%s\n' $text[3]
).fuente
Puedes usar el comando de corte. Para obtener la tercera posición:
Consulte este enlace http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Casos avanzados ) Sin embargo, modificar IFS también es algo bueno, especialmente cuando su entrada puede tener espacios. Solo en ese caso, use el siguiente
fuente
IFS
entraría en juego el código que publicaste.