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}
zshe 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
substrnon è incluso nell'espr da FreeBSD, NetBSD o OS X. Questa non è una soluzione portatile.
substrorigine non è un'estensione GNU. L'implementazione originale è exprarrivata 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 -c2non è POSIX poiché l'output di printfnon è testo se non $myvartermina con un carattere di nuova riga. Suppone altrimenti che la variabile non contenga caratteri di nuova riga poiché cuttaglia ogni riga del suo input.
awkuno 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)?
cutnon è specificato se l'input non è di testo (sebbene cutsiano necessarie implementazioni per gestire linee o lunghezza arbitraria). L'output di printf abcnon è 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 -c2ottenere un comportamento specificato da POSIX (necessario per l'output b<newline>)
Con zsho 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
IFSentrerebbe in gioco il codice che hai pubblicato.