在Shell中,正则表达式是一种强大的工具,可以用于文本匹配和模式搜索。Shell中常用的工具包括grep、sed和awk,它们提供了对正则表达式的支持。下面详细解释一下Shell中的正则匹配。
grep:grep命令用于在文件或文本流中搜索匹配某个模式的行。它支持使用正则表达式进行模式匹配。
grep pattern file.txt
sed:sed命令用于对文本进行流式编辑。它可以使用正则表达式来匹配和替换文本中的模式。
sed 's/pattern/replace/g' file.txt
awk:awk是一种强大的文本处理工具,它可以根据模式和动作来处理文本数据。awk支持使用正则表达式来匹配和处理数据。
awk '/pattern/ {print $1}' file.txt
在Shell中,正则表达式的语法和特性可以略有不同,取决于使用的Shell解释器和工具。下面是一些常见的正则表达式语法和特性:
基础正则匹配
字符 | 含义 |
---|---|
. | 匹配任意一个字符 |
* | 匹配前一个字符的零个或多个重复 |
[] | 匹配括号内的任意一个字符 |
[^] | 匹配不在括号内的任意一个字符 |
^ | 匹配行的开头 |
$ | 匹配行的结尾 |
grep 'a.c' filename.txt # 匹配包含 "a",然后是任意字符,再是 "c" 的行
grep '^abc' filename.txt # 匹配以 "abc" 开头的行
grep 'xyz$' filename.txt # 匹配以 "xyz" 结尾的行
字符类别的正则表达式
字符 | 含义 |
---|---|
[:alnum:] | 代表英文大小写字符及数字,即0-9,a-z,A-Z |
[:alpha:] | 代表大小写字符,即a-z,A-Z |
[:blank:] | 代表空格和Tab |
[:cntrl:] | 代表键盘的控制按键,包含CR,LF,Tab,Del等 |
[:digit:] | 代表数字,即0-9 |
[:graph:] | 代表除了(空格和Tab)之外所有按键 |
[:lower:] | 代表小写字符,即a-z |
[:print:] | 代表任何可被打印的字符 |
[:punct:] | 代表标点符号,即,./;'#$%等 |
[:upper:] | 代表大写字符,即A-Z |
grep '^[[:alnum:]]*$' filename.txt # 验证文件中的每行是否只包含英文大小写字符和数字
grep '^[[:alpha:]]*$' filename.txt # 提取文件中只包含大小写字符的行
grep '[[:blank:]]' filename.txt # 匹配包含空格和制表符的行
grep '[[:cntrl:]]' filename.txt # 过滤包含控制字符的文本
grep '^[[:digit:]]*$' filename.txt # 验证文件中的每行是否只包含数字
grep '[[:graph:]]' filename.txt # 查找包含可打印字符的行
grep '^[[:lower:]]*$' filename.txt # 验证文件中的每行是否只包含小写字符
grep '[[:print:]]' filename.txt # 提取包含可打印字符的文本
grep '[[:punct:]]' filename.txt # 去除标点符号
grep '^[[:upper:]]*$' filename.txt # 验证文件中的每行是否只包含大写字符
echo "Hello123" | grep -E '[[:alnum:]]+'
扩展正则匹配
字符 | 含义 |
---|---|
+ | 匹配前一个字符的一个或多个重复 |
? | 匹配前一个字符的零个或一个重复 |
() | 用于分组捕获 |
| | 用于逻辑或操作 |
+:匹配前一个字符的一个或多个重复。
echo "ab" | grep 'ab\+' # 匹配成功,'b'重复了一次
echo "abb" | grep 'ab\+' # 匹配成功,'b'重复了多次
echo "a" | grep 'ab\+' # 不匹配,没有'b'
?:匹配前一个字符的零个或一个重复。
echo "a" | grep 'ab\?' # 匹配成功,没有'b'
echo "ab" | grep 'ab\?' # 匹配成功,有一个'b'
echo "abb" | grep 'ab\?' # 不匹配,有多个'b'
():用于分组捕获。
echo "ab" | grep '\(ab\)\+' # 不匹配,只有一个'ab'
echo "abab" | grep '\(ab\)\+' # 匹配成功,有两个连续的'ab'组合
echo "ababab" | grep '\(ab\)\+' # 匹配成功,有三个连续的'ab'组合
|:用于逻辑或操作
echo "I have a cat" | grep 'cat\|dog' # 匹配成功,包含'cat'
echo "I have a dog" | grep 'cat\|dog' # 匹配成功,包含'dog'
echo "I have a bird" | grep 'cat\|dog' # 不匹配,既不包含'cat'也不包含'dog'