Відповіді:
Нарешті на "Розширення параметра" $ {параметр: зміщення: довжина}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Редагувати: Без розширення параметрів (не дуже елегантно, але це мені найперше)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zshі mksh.
Альтернативою розширення параметрів є expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Наприклад:
$ expr substr hello 2 1
e
substrале не включено в expr з FreeBSD, NetBSD або OS X. Це не портативне рішення.
substrспочатку це не є розширенням GNU. Початкова реалізація exprприйшла від PWB Unix наприкінці 70-х і мала substr(але ні :).
cut -c
Якщо змінна не містить нових рядків, ви можете зробити:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
Виходи:
b
awk substr - це ще одна альтернатива POSIX, яка працює, навіть якщо змінна має нові рядки:
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"
Виходи:
b
printf '%s\n'це уникати проблем із символами втечі: /programming//a/40423558/895245, наприклад:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
Виходи, \як очікувалося.
Дивіться також: /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 або busbox 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, ви б використовували:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(в zsh, ви можете скоротити його до printf '%s\n' $text[3]).
Можна використовувати команду cut. Щоб отримати 3 місце:
echo "SAMPLETEXT" | cut -c3
Перевірте це посилання http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Розширені випадки ) Однак зміна IFS також є хорошою справою, особливо коли у вашому введенні може бути пробілів. В такому випадку використовуйте наведене нижче
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFSби грати в коді, який ви опублікували.