Jak uzyskać znak w danej pozycji ciągu w skrypcie powłoki?
shell
shell-script
Tom Brito
źródło
źródło
echo ${var: -2:1}
zsh
imksh
.Alternatywą dla rozszerzania parametrów jest
expr substr
Na przykład:
źródło
substr
nie jest uwzględniony w expr z FreeBSD, NetBSD lub OS X. To nie jest przenośne rozwiązanie.substr
oryginalnie nie jest to rozszerzenie GNU. Oryginalna implementacjaexpr
pochodzi z PWB Unix pod koniec lat 70. i miałasubstr
(ale nie:
).cut -c
Jeśli zmienna nie zawiera znaków nowej linii, możesz:
wyjścia:
awk substr
to kolejna alternatywa POSIX, która działa, nawet jeśli zmienna ma znaki nowego wiersza:wyjścia:
printf '%s\n'
jest uniknięcie problemów ze znakami zmiany znaczenia: /programming//a/40423558/895245 np .:wyniki
\
zgodnie z oczekiwaniami.Zobacz także: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testowane w Ubuntu 19.04.
źródło
printf '%s' "$myvar" | cut -c2
nie jest POSIX, ponieważ wynikprintf
nie jest tekstem, chyba że$myvar
kończy się znakiem nowej linii. W przeciwnym razie zakłada, że zmienna nie zawiera znaków nowej linii, ponieważcut
przecina każdą linię jej danych wejściowych.awk
byłby bardziej wydajny i niezawodny zawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, że nie działa dla znaków wielo-bajtowych (taki sam dla mawk lub BusyBox awk)printf 'abc '| cut -c2
to jest złe, ponieważ nie\n
(o tym nie wiem), czy że polecenie nie powiedzie się, jeśli myvar ma nowe linie (zgadzam się)?cut
jest określone, jeśli dane wejściowe nie są tekstem (choćcut
implementacje są wymagane do obsługi wierszy lub dowolnej długości). Wynikprintf abc
nie jest tekstem, ponieważ nie kończy się znakiem nowego wiersza. W praktyce, w zależności od implementacji, jeśli to zrobiszcut -c2
, dostaniesz albo nicb
,b<newline>
albo wcale. Trzeba byprintf 'abc\n' | cut -c2
uzyskać zachowanie określone przez POSIX (wymagane do wyjściab<newline>
)Z
zsh
lubyash
użyłbyś:(w
zsh
, możesz go skrócićprintf '%s\n' $text[3]
).źródło
Możesz użyć polecenia cięcia. Aby uzyskać trzecią pozycję:
Sprawdź ten link http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Przypadki zaawansowane ) Jednak modyfikacja IFS jest również dobrą rzeczą, szczególnie gdy twoje dane wejściowe mogą zawierać spacje. Tylko w takim przypadku skorzystaj z poniższego
źródło
IFS
by się to grało w opublikowanym kodzie.