Answers:
在带有“参数扩展”的bash中$ {parameter:offset:length}
$ 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
and 支持mksh
。
参数扩展的替代方法是 expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
例如:
$ expr substr hello 2 1
e
substr
不包含在FreeBSD,NetBSD或OS X的expr中。这不是便携式解决方案。
substr
它最初不是GNU扩展。最初的实现expr
来自70年代后期的PWB Unix,并且具有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'
为了避免转义字符出现问题:https : //stackoverflow.com/a/40423558/895245例如:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
\
预期的输出。
另请参阅:https : //stackoverflow.com/questions/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
,您将使用:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(在中zsh
,您可以将其缩短为printf '%s\n' $text[3]
)。
您可以使用cut命令。要获得第三名:
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
您发布的代码将如何发挥作用。