2. 字符串的属性

字符串的类型

字符有可能是数字、字母、空格、其他特殊字符,而字符串有可能是它们中的一种或者多种的组合,在组合之后还可能形成具有特定意义的字符串,诸如邮件地址,URL地址等。

范例:数字或者数字组合

$ i=5;j=9423483247234;
$ echo $i | grep -q "^[0-9]$"
$ echo $?
0
$ echo $j | grep -q "^[0-9]\+$"
$ echo $?
0

范例:字符组合(小写字母、大写字母、两者的组合)

$ c="A"; d="fwefewjuew"; e="fewfEFWefwefe"
$ echo $c | grep -q "^[A-Z]$"
$ echo $d | grep -q "^[a-z]\+$"
$ echo $e | grep -q "^[a-zA-Z]\+$"

范例:字母和数字的组合

$ ic="432fwfwefeFWEwefwef"
$ echo $ic | grep -q "^[0-9a-zA-Z]\+$"

范例:空格或者 Tab 键等

$ echo " " | grep " "
$ echo -e "\t" | grep "[[:space:]]" #[[:space:]]会同时匹配空格和TAB键
$ echo -e " \t" | grep "[[:space:]]"
$ echo -e "\t" | grep "" #为在键盘上按下TAB键,而不是字符

范例:匹配邮件地址

$ echo "test2007@lzu.cn" | grep "[0-9a-zA-Z\.]*@[0-9a-zA-Z\.]*"
test2007@lzu.cn

范例:匹配 URL 地址(以 http 链接为例)

$ echo "http://news.lzu.edu.cn/article.jsp?newsid=10135" | grep "^http://[0-9a-zA-Z\./=?]\+$"
http://news.lzu.edu.cn/article.jsp?newsid=10135

说明:

  • /dev/null/dev/zero 设备非常有趣,都犹如黑洞,什么东西掉进去都会消失殆尽;后者还是个能源箱,总能从那里取到0,直到退出
  • [[:space:]]grep 用于匹配空格或 TAB 键字符的标记,其他标记请查帮助:man grep
  • 上面都是用 grep 来进行模式匹配,实际上 sedawk 都可用来做模式匹配,关于匹配中用到的正则表达式知识,请参考后面的相关资料
  • 如果想判断字符串是否为空,可判断其长度是否为零,可通过 test 命令的 -z 选项来实现,具体用法见 test 命令,help test

范例:判断字符是否为可打印字符

$ echo "\t\n" | grep "[[:print:]]"
\t\n
$ echo $?
0
$ echo -e "\t\n" | grep "[[:print:]]"
$ echo $?
1

字符串的长度

除了组成字符串的字符类型外,字符串还有哪些属性呢?组成字符串的字符个数。

下面我们来计算字符串的长度,即所有字符的个数,并简单介绍几种求字符串中指定字符个数的方法。

范例:计算某个字符串的长度

即计算所有字符的个数,计算方法五花八门,择其优着而用之:

$ var="get the length of me"
$ echo ${var}     # 这里等同于$var
get the length of me
$ echo ${#var}
20
$ expr length "$var"
20
$ echo $var | awk '{printf("%d\n", length($0));}'
20
$ echo -n $var |  wc -c
20

范例:计算某些指定字符或者字符组合的个数

$ echo $var | tr -cd g | wc -c
2
$ echo -n $var | sed -e 's/[^g]//g' | wc -c
2
$ echo -n $var | sed -e 's/[^gt]//g' | wc -c
5

范例:统计单词个数

更多相关信息见 第一章:数值运算单词统计 相关范例。

$ echo $var | wc -w
5
$ echo "$var" | tr " " "\n" | grep get | uniq -c
1
$ echo "$var" | tr " " "\n" | grep get | wc -l
1

说明:

${} 操作符在 Bash 里头是一个“大牛”,能胜任相当多的工作,具体就看网中人的《Shell十三问》之$(())$() 还有${}差在哪?"吧。