尽管我几乎可以确定已经解决了这个问题,但是我似乎找不到任何特定的东西。当我继续学习bash的过程时,我会不断寻找令事情困惑的部分。

在编写脚本时,搜索和替换或仅匹配字符串中的子字符串很可能是您要做的第一件事。但是,尝试使用一种语言或一组工具很难在bash中完成,因为您能够以多种方式解决大多数问题。我正在尽力使bash保持尽可能低的水平。我遇到了麻烦,需要有人向我解释。

在bash中使用match进行子字符串搜索会给我不同的结果,具体取决于我使用的正则表达式,我不确定为什么。

#!/bin/bash
Stext="Hallo World"
echo `expr "$Stext" : '^\(.[a-z]*\)'` # Hallo
echo `expr "$Stext" : '.*World'`      # 11

我认为,尽管两者都在寻找一个单词,但两者都不返回所找到的内容。为什么?

最佳答案

这两个表达式是等效的,不同之处在于您使用的正则表达式:

$ echo `expr "$Stext" : '^\(.[a-z]*\)'`
Hallo
$ echo `expr "$Stext" : '^.[a-z]*'`
5
$ echo `expr "$Stext" : '\(.*World\)'`
Hallo World
$ echo `expr "$Stext" : '.*World'`
11

如您所见,括号是返回匹配长度或匹配本身的区别所在。

您可以在《高级Bash脚本指南》的Chapter 10中找到更多示例。

10-02 03:02