Как получить символ в заданной позиции строки в сценарии оболочки?
shell
shell-script
Том Брито
источник
источник
echo ${var: -2:1}
zsh
иmksh
.Альтернатива расширению параметра
expr substr
Например:
источник
substr
оно не включено в выражение из FreeBSD, NetBSD или OS X. Это не переносимое решение.substr
изначально это не расширение GNU. Первоначальная реализацияexpr
пришла из PWB Unix в конце 70-х и имелаsubstr
(но не:
).cut -c
Если переменная не содержит символов новой строки, вы можете сделать:
выходы:
awk substr
это еще одна альтернатива POSIX, которая работает, даже если переменная имеет символы новой строки:выходы:
printf '%s\n'
чтобы избежать проблем с escape-символами: /programming//a/40423558/895245 например:выходы
\
как положено.Смотрите также: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Проверено в Ubuntu 19.04.
источник
printf '%s' "$myvar" | cut -c2
не POSIX, так как выводprintf
не является текстом, если не$myvar
заканчивается символом новой строки. В противном случае предполагается, что переменная не содержит символов новой строки, так какcut
обрезает каждую строку ввода.awk
был бы более эффективным и надежным сawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
это не работает для многобайтовых символов (то же самое для mawk или busybox awk)printf 'abc '| cut -c2
это неправильно, потому что нет\n
(об этом я не знаю), или что команда не выполнится, если у myvar есть новые строки (это я согласен)?cut
не определено, если ввод не текстовый (хотяcut
реализации требуются для обработки строк или произвольной длины). Выводprintf abc
не является текстом, поскольку он не заканчивается символом новой строки. На практике, в зависимости от реализации, если вы передадите этоcut -c2
, вы получите либо ничегоb
,b<newline>
либо вообще ничего. Вам нужноprintf 'abc\n' | cut -c2
получить поведение, указанное в POSIX (это необходимо для выводаb<newline>
)С помощью
zsh
илиyash
вы бы использовали:(в
zsh
, вы можете сократить его доprintf '%s\n' $text[3]
).источник
Вы можете использовать команду вырезать. Чтобы получить 3-е положение:
Проверьте эту ссылку http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Расширенные случаи ) Однако, изменение IFS также является хорошей вещью, особенно когда ваш ввод может содержать пробелы. Только в этом случае используйте приведенный ниже
источник
IFS
в игру вступит код, который вы опубликовали.