shell的正则表达

在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'

猜你喜欢

转载自blog.csdn.net/liulanba/article/details/134843855