Linux技巧:使用 expr 命令获取子字符串和字符串长度

在 Linux 中,我们可以使用 expr 命令对字符串做一些处理。例如:

  • expr index STRING CHARS 获取指定字符在字符串中的位置
  • expr substr STRING POS LENGTH 从字符串中获取到子字符串
  • expr length STRING 获取字符串的长度

expr index STRING CHARS

查看 man expr 对 index STRING CHARS 表达式说明如下:

index STRING CHARS
index in STRING where any CHARS is found, or 0

即,expr index STRING CHARS 命令可以获取 CHARS 包含的任意字符在 STRING 字符串中第一次出现的位置。
位置偏移是从 1 开始数起,不是从 0 开始。
如果 CHARS 包含的所有字符都没有找到,返回为 0。
STRING 字符串的内容包含空格时,要用双引号括起来,否则会报错。

注意expr index STRING CHARS 命令并不是查找 CHARS 子字符串在 STRING 字符串中的位置。
它只能查找单个字符在 STRING 字符串中的位置。
只是 CHARS 可以指定要查找哪几个字符,并以第一个查找到的字符为准。

具体举例说明如下:

$ value="This is a test string."
$ expr index $value a
expr: syntax error
$ expr index "$value" a
9
$ expr index "$value" p
0
$ expr index "$value" "test"
4
$ expr index "$value" "est"
4

可以看到,由于 value 变量值包含空格,当使用 $value、没有加双引号时,命令执行报错。
使用 "$value"、加了双引号后,没有报错。

expr index "$value" a 命令返回 a 字符在 value 变量值中的位置是 9,位置偏移从 1 开始。

由于 p 字符在 value 变量值中不存在,expr index "$value" p 返回为 0。

expr index "$value" "test" 命令并不是返回 "test" 子字符串在 value 变量值中的位置。
而是返回 tes 这三个字符的任意一个在 value 变量值中第一次出现的位置。
那么第一次出现的字符是 s,位于开头的 "This" 子字符串,从 1 开始数起,是第 4 个字符,所以该命令返回为 4。

由于是查找多个字符中的任意一个字符,跟提供的字符先后顺序无关。
所以 expr index "$value" "est" 命令也是返回 4。
并不因为 "est" 参数的 e 字符在 s 字符前面就优先查找 e 字符。

expr substr STRING POS LENGTH

查看 man expr 对 substr STRING POS LENGTH 表达式说明如下:

substr STRING POS LENGTH
substring of STRING, POS counted from 1

即,expr substr STRING POS LENGTH 命令从 STRING 字符串的第 POS 个字符开始,一直获取 LENGTH 个字符,得到一个子字符串。
位置偏移从 1 开始,不是从 0 开始。
STRING 字符串的内容包含空格时,要用双引号括起来,否则会报错。

具体举例说明如下:

$ value="This is a test string."
$ expr substr "$value" 6 2
is
$ expr substr "$value" 11 4
test

可以看到,expr substr "$value" 6 2 命令从 value 变量值的第 6 个字符开始,获取包括该字符在内的两个字符,得到 "is" 子字符串。
expr substr "$value" 11 4 命令的执行结果类似。

expr length STRING

查看 man bash 对 length STRING 表达式说明如下:

length STRING
length of STRING

即,expr length STRING 获取 STRING 字符串的长度。长度从 1 开始。
STRING 字符串的内容包含空格时,要用双引号括起来,否则会报错。

具体举例说明如下:

$ value="come on"
$ expr length "$value"
7
$ expr length $value
expr: syntax error

可以看到,value 变量值带有空格。
$value 没有用双引号括起来时,expr length $value 命令执行报错。

阅读 151

推荐阅读
南木阁
用户专栏

考据党一枚,力求讲述的每个知识点都有出处,有理有据。如能恰好地解答您的疑问,欢迎点赞,谢谢!

3 人关注
71 篇文章
专栏主页