Antworten:
In der Bash mit "Parameter Expansion" $ {parameter: offset: length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Edit: Ohne Parametererweiterung (nicht sehr elegant, aber das ist mir zuerst eingefallen)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zshund unterstützt mksh.
Alternative zur Parametererweiterung ist expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Beispielsweise:
$ expr substr hello 2 1
e
substrist jedoch nicht in dem Ausdruck von FreeBSD, NetBSD oder OS X enthalten. Dies ist keine portable Lösung.
substres sich ursprünglich nicht um eine GNU-Erweiterung handelt. Die ursprüngliche Implementierung von exprkam von PWB Unix in den späten 70ern und hatte substr(aber nicht :).
cut -c
Wenn die Variable keine Zeilenumbrüche enthält, können Sie Folgendes tun:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
Ausgänge:
b
awk substr ist eine weitere POSIX-Alternative, die auch dann funktioniert, wenn die Variable Zeilenumbrüche enthält:
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"
Ausgänge:
b
printf '%s\n'soll Probleme mit Escape-Zeichen vermeiden: /programming//a/40423558/895245 zB:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
Ausgänge \wie erwartet.
Siehe auch: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Getestet in Ubuntu 19.04.
printf '%s' "$myvar" | cut -c2ist nicht POSIX, da die Ausgabe von printfkein Text ist, es sei denn, sie $myvarendet in einem Zeilenumbruch. Er geht davon aus sonst die Variable enthält keine Zeilenumbrüche wie cutschneidet jede Zeile seiner Eingabe.
awkeine wäre effizienter und zuverlässiger mitawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cutnicht für Multi-Byte-Zeichen funktioniert (dasselbe gilt für mawk oder busybox awk)
printf 'abc '| cut -c2ist falsch, weil nein \n(das weiß ich nicht), oder dass der Befehl fehlschlägt, wenn myvar Zeilenumbrüche enthält (dem stimme ich zu)?
cutist nicht spezifiziert, wenn die Eingabe kein Text ist (obwohl cutImplementierungen erforderlich sind, um Zeilen oder eine beliebige Länge zu verarbeiten). Die Ausgabe von printf abcist kein Text, da sie nicht in einem Zeilenumbruch endet. In der Praxis je nach Implementierung, wenn Sie Rohr , das zu cut -c2, Sie entweder b, b<newline>oder gar nichts. Sie müssten printf 'abc\n' | cut -c2ein von POSIX festgelegtes Verhalten erhalten (das für die Ausgabe erforderlich ist b<newline>)
Mit zshoder würden yashSie Folgendes verwenden:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(In zsh, Sie können es zu kürzen printf '%s\n' $text[3]).
Sie können den Befehl Ausschneiden verwenden. So erhalten Sie die 3. Position:
echo "SAMPLETEXT" | cut -c3
Überprüfen Sie diesen Link http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Fortgeschrittene Fälle ) Das Ändern von IFS ist jedoch auch eine gute Sache, insbesondere wenn Ihre Eingabe möglicherweise Leerzeichen enthält. Verwenden Sie in diesem Fall nur den folgenden
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFSder von Ihnen gepostete Code ins Spiel kommen würde.