Como obter o char em uma determinada posição de uma string no shell script?
shell
shell-script
Tom Brito
fonte
fonte
echo ${var: -2:1}
zsh
emksh
.A alternativa à expansão de parâmetros é
expr substr
Por exemplo:
fonte
substr
não está incluído no expr do FreeBSD, NetBSD ou OS X. Esta não é uma solução portátil.substr
não é originalmente uma extensão GNU. A implementação originalexpr
veio do PWB Unix no final dos anos 70 e tevesubstr
(mas não:
).cut -c
Se a variável não contiver novas linhas, você poderá:
saídas:
awk substr
é outra alternativa POSIX que funciona mesmo que a variável tenha novas linhas:saídas:
printf '%s\n'
é evitar problemas com caracteres de escape: /programming//a/40423558/895245, por exemplo:saídas
\
conforme o esperado.Consulte também: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testado no Ubuntu 19.04.
fonte
printf '%s' "$myvar" | cut -c2
não é POSIX, pois a saída deprintf
não é texto, a menos que$myvar
termine com um caractere de nova linha. Caso contrário, assume que a variável não contém caracteres de nova linha comocut
corta cada linha de sua entrada.awk
primeiro seria mais eficiente e confiável comawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, isso não funciona para caracteres de vários bytes (o mesmo para mawk ou busybox awk)printf 'abc '| cut -c2
está errado porque não\n
(não sei disso) ou que o comando falhará se myvar tiver novas linhas (concordo)?cut
não é especificado se a entrada não for texto (emboracut
sejam necessárias implementações para manipular linhas ou comprimento arbitrário). A saída deprintf abc
não é texto , pois não termina em um caractere de nova linha. Na prática, dependendo da implementação, se você canalizar isso paracut -c2
você obter qualquerb
,b<newline>
ou nada. Você precisariaprintf 'abc\n' | cut -c2
obter um comportamento especificado pelo POSIX (que é necessário para a saídab<newline>
)Com
zsh
ouyash
, você usaria:(em
zsh
, você pode abreviá-loprintf '%s\n' $text[3]
).fonte
Você pode usar o comando recortar. Para obter a terceira posição:
Verifique este link http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Casos avançados ) No entanto, modificar o IFS também é uma coisa boa, especialmente quando sua entrada pode ter espaços. Somente nesse caso, use o abaixo
fonte
IFS
entraria em jogo no código que você postou.