Respostas:
No bash com "Parameter Expansion" $ {parameter: offset: length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Edit: Sem expansão de parâmetros (não muito elegante, mas foi o que me ocorreu primeiro)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
e mksh
.
A alternativa à expansão de parâmetros é expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Por exemplo:
$ expr substr hello 2 1
e
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 original expr
veio do PWB Unix no final dos anos 70 e teve substr
(mas não :
).
cut -c
Se a variável não contiver novas linhas, você poderá:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
saídas:
b
awk substr
é outra alternativa POSIX que funciona mesmo que a variável tenha novas linhas:
myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
# the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"
saídas:
b
printf '%s\n'
é evitar problemas com caracteres de escape: /programming//a/40423558/895245, por exemplo:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
saídas \
conforme o esperado.
Consulte também: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testado no Ubuntu 19.04.
printf '%s' "$myvar" | cut -c2
não é POSIX, pois a saída de printf
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 como cut
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 (embora cut
sejam necessárias implementações para manipular linhas ou comprimento arbitrário). A saída de printf 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 para cut -c2
você obter qualquer b
, b<newline>
ou nada. Você precisaria printf 'abc\n' | cut -c2
obter um comportamento especificado pelo POSIX (que é necessário para a saída b<newline>
)
Com zsh
ou yash
, você usaria:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(em zsh
, você pode abreviá-lo printf '%s\n' $text[3]
).
Você pode usar o comando recortar. Para obter a terceira posição:
echo "SAMPLETEXT" | cut -c3
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
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
entraria em jogo no código que você postou.