当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 字符串操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:35

由 娃娃脸呦 创建,Loen 最后一次修改 2016-02-24 前言忙活了一个礼拜,终于等到周末,可以空下来写点东西。之前已经完成《数值运算》和《布尔运算》,这次轮到介绍字符串操作 。咱们先得弄明白两个内容:什么是字符串?对字符串有哪些操作?下面是"在线新华字典"的解释:字符串:简称“串”。有限字符的序列。数据元素为字符的线性表,是一种数据的逻辑结构。在计算机中可有不同的存储结构。在串上可进行求子串、插入字符、删除字符、置换字符等运算。而字符呢?字符:计算机程序设计及操作时使用的符号。包括字母、数字、空格符、提示符及各种专用字符等。照这样说,之前介绍的数值运算中的数字,布尔运算中的真假值,都是以字符的形式呈现出来的,是一种特别的字符,对它们的运算只不过是字符操作的特例罢了。而这里将研究一般字符的运算,它具有非常重要的意义,因为对我们来说,一般的工作都是处理字符而已。这些运算实际上将围绕上述两个定义来做,它们包括:找出字符或者字符串的类型,是数字、字母还是其他特定字符,是可打印字符,还是不可打印字符(一些控制字符)。找出组成字符串的字符个数和字符串的存储结构(比如数组)。对串的常规操作:求子串、插入字符、删除字符、置换字符、字符串的比较等。对串的一些比较复杂而有趣的操作,这里将在最后介绍一些有趣的范例。字符串的属性字符串的类型字符有可能是数字、字母、空格、其他特殊字符,而字符串有可能是它们中的一种或者多种的组合,在组合之后还可能形成具有特定意义的字符串,诸如邮件地址,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 来进行模式匹配,实际上 sed,awk 都可用来做模式匹配,关于匹配中用到的正则表达式知识,请参考后面的相关资料如果想判断字符串是否为空,可判断其长度是否为零,可通过 test 命令的 -z 选项来实现,具体用法见 test 命令,man 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} # 这里等同于$varget the length of me$ echo ${#var}20$ expr length "$var"20$ echo $var | awk '{printf("%d\n", length($0));}'20$ echo -n $var | wc -c20范例:计算某些指定字符或者字符组合的个数$ echo $var | tr -cd g | wc -c2$ echo -n $var | sed -e 's/[^g]//g' | wc -c2$ echo -n $var | sed -e 's/[^gt]//g' | wc -c5范例:统计单词个数更多相关信息见《数值计算》的单词统计 相关范例。$ echo $var | wc -w5$ echo "$var" | tr " " "\n" | grep get | uniq -c1$ echo "$var" | tr " " "\n" | grep get | wc -l1说明:${} 操作符在 Bash 里头是一个“大牛”,能胜任相当多的工作,具体就看网中人的《Shell十三问》之$(())与$() 还有${}差在哪?"吧。字符串的显示接下来讨论如何控制字符在终端的显示。范例:在屏幕控制字符显示位置、颜色、背景等$ echo -e "\033[31;40m" #设置前景色为黑色,背景色为红色$ echo -e "\033[11;29H Hello, World\!" #在屏幕的第11行,29列开始打印字符串Hello,World!范例:在屏幕的某个位置动态显示当前系统时间$ while :; do echo -e "\033[11;29H "$(date "+%Y-%m-%d %H:%M:%S"); done范例:过滤掉某些控制字符串用 col 命令过滤某些控制字符,在处理诸如 script,screen 等截屏命令的输出结果时,很有用。$ screen -L$ cat /bin/cat$ exit$ cat screenlog.0 | col -b # 把一些控制字符过滤后,就可以保留可读的操作日志字符串的存储在我们看来,字符串是一连串的字符而已,但是为了操作方便,我们往往可以让字符串呈现出一定的结构。在这里,我们不关心字符串在内存中的实际存储结构,仅仅关系它呈现出来的逻辑结构。比如,这样一个字符串: get the length of me",我们可以从不同的方面来呈现它。通过字符在串中的位置来呈现它这样我们就可以通过指定位置来找到某个子串。这在 C 语言中通常可以利用指针来做。而在 Shell 编程中,有很多可用的工具,诸如 expr,awk 都提供了类似方法来实现子串的查询动作。两者都几乎支持模式匹配 match 和完全匹配 index。这在后面的字符串操作中将详细介绍。根据某个分割符来取得字符串的各个部分这里最常见的就是行分割符、空格或者 TAB 分割符了,前者用来当行号,我们似乎已经司空见惯了,因为我们的编辑器就这样“莫名”地处理着行分割符(在 UNIX 下为 \\n,在其他系统下有一些不同,比如 Windows 下为 \r\n )。而空格或者 TAB 键经常用来分割数据库的各个字段,这似乎也是司空见惯的

[1] [2] [3] [4] [5]  下一页


Shell 字符串操作