Risposte:
In bash con "Parameter Expansion" $ {parametro: offset: lunghezza}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Modifica: senza espansione dei parametri (non molto elegante, ma è quello che mi è venuto prima)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
e mksh
.
L'alternativa all'espansione dei parametri è expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Per esempio:
$ expr substr hello 2 1
e
substr
non è incluso nell'espr da FreeBSD, NetBSD o OS X. Questa non è una soluzione portatile.
substr
origine non è un'estensione GNU. L'implementazione originale è expr
arrivata da PWB Unix alla fine degli anni '70 e aveva substr
(ma non :
).
cut -c
Se la variabile non contiene newline puoi fare:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
uscite:
b
awk substr
è un'altra alternativa POSIX che funziona anche se la variabile ha newline:
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"
uscite:
b
printf '%s\n'
è per evitare problemi con i caratteri di escape: /programming//a/40423558/895245 ad esempio:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
output \
come previsto.
Vedi anche: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testato su Ubuntu 19.04.
printf '%s' "$myvar" | cut -c2
non è POSIX poiché l'output di printf
non è testo se non $myvar
termina con un carattere di nuova riga. Suppone altrimenti che la variabile non contenga caratteri di nuova riga poiché cut
taglia ogni riga del suo input.
awk
uno sarebbe più efficiente e affidabile conawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, che non funziona per i caratteri multi-byte (lo stesso per mawk o busybox awk)
printf 'abc '| cut -c2
è sbagliato perché no \n
(questo non lo so), o che il comando fallirà se myvar ha newline (questo sono d'accordo)?
cut
non è specificato se l'input non è di testo (sebbene cut
siano necessarie implementazioni per gestire linee o lunghezza arbitraria). L'output di printf abc
non è testo in quanto non termina in un carattere di nuova riga. In pratica a seconda della realizzazione, se il tubo che per cut -c2
, si ottiene uno b
, b<newline>
o niente del tutto. Dovresti printf 'abc\n' | cut -c2
ottenere un comportamento specificato da POSIX (necessario per l'output b<newline>
)
Con zsh
o yash
, useresti:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(in zsh
, puoi accorciarlo a printf '%s\n' $text[3]
).
Puoi usare il comando taglia. Per ottenere la 3a posizione:
echo "SAMPLETEXT" | cut -c3
Controlla questo link http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Casi avanzati ) Tuttavia, anche la modifica di IFS è una buona cosa, specialmente quando l'input potrebbe contenere spazi. Solo in quel caso, usa quello qui sotto
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
entrerebbe in gioco il codice che hai pubblicato.