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}
zsh
und 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
substr
ist jedoch nicht in dem Ausdruck von FreeBSD, NetBSD oder OS X enthalten. Dies ist keine portable Lösung.
substr
es sich ursprünglich nicht um eine GNU-Erweiterung handelt. Die ursprüngliche Implementierung von expr
kam 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 -c2
ist nicht POSIX, da die Ausgabe von printf
kein Text ist, es sei denn, sie $myvar
endet in einem Zeilenumbruch. Er geht davon aus sonst die Variable enthält keine Zeilenumbrüche wie cut
schneidet jede Zeile seiner Eingabe.
awk
eine wäre effizienter und zuverlässiger mitawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
nicht für Multi-Byte-Zeichen funktioniert (dasselbe gilt für mawk oder busybox awk)
printf 'abc '| cut -c2
ist falsch, weil nein \n
(das weiß ich nicht), oder dass der Befehl fehlschlägt, wenn myvar Zeilenumbrüche enthält (dem stimme ich zu)?
cut
ist nicht spezifiziert, wenn die Eingabe kein Text ist (obwohl cut
Implementierungen erforderlich sind, um Zeilen oder eine beliebige Länge zu verarbeiten). Die Ausgabe von printf abc
ist 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 -c2
ein von POSIX festgelegtes Verhalten erhalten (das für die Ausgabe erforderlich ist b<newline>
)
Mit zsh
oder würden yash
Sie 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
IFS
der von Ihnen gepostete Code ins Spiel kommen würde.