Wie bekomme ich das Zeichen an einer bestimmten Position eines Strings in einem Shell-Skript?
shell
shell-script
Tom Brito
quelle
quelle
echo ${var: -2:1}
zsh
und unterstütztmksh
.Alternative zur Parametererweiterung ist
expr substr
Beispielsweise:
quelle
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 vonexpr
kam von PWB Unix in den späten 70ern und hattesubstr
(aber nicht:
).cut -c
Wenn die Variable keine Zeilenumbrüche enthält, können Sie Folgendes tun:
Ausgänge:
awk substr
ist eine weitere POSIX-Alternative, die auch dann funktioniert, wenn die Variable Zeilenumbrüche enthält:Ausgänge:
printf '%s\n'
soll Probleme mit Escape-Zeichen vermeiden: /programming//a/40423558/895245 zB:Ausgänge
\
wie erwartet.Siehe auch: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Getestet in Ubuntu 19.04.
quelle
printf '%s' "$myvar" | cut -c2
ist nicht POSIX, da die Ausgabe vonprintf
kein Text ist, es sei denn, sie$myvar
endet in einem Zeilenumbruch. Er geht davon aus sonst die Variable enthält keine Zeilenumbrüche wiecut
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 (obwohlcut
Implementierungen erforderlich sind, um Zeilen oder eine beliebige Länge zu verarbeiten). Die Ausgabe vonprintf abc
ist kein Text, da sie nicht in einem Zeilenumbruch endet. In der Praxis je nach Implementierung, wenn Sie Rohr , das zucut -c2
, Sie entwederb
,b<newline>
oder gar nichts. Sie müsstenprintf 'abc\n' | cut -c2
ein von POSIX festgelegtes Verhalten erhalten (das für die Ausgabe erforderlich istb<newline>
)Mit
zsh
oder würdenyash
Sie Folgendes verwenden:(In
zsh
, Sie können es zu kürzenprintf '%s\n' $text[3]
).quelle
Sie können den Befehl Ausschneiden verwenden. So erhalten Sie die 3. Position:
Ü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
quelle
IFS
der von Ihnen gepostete Code ins Spiel kommen würde.