正则

正则表达式

image-20241104200449192

image-20241104200512515

image-20241104200754326

Perl正则;-P

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 单字符
.		# 任意字符(\n除外)
\d		# 数字
\w		# 数字,字符,下划线
\s		# 空格
[]		# 多选一 [0-9] [a-z]
[^]		# 取反

#量词
*		# 0到多
+		# 1到多
?		# 0或1
{N}		# N个
{M,N}	# M到N个

# 断言
^		# 开头
$		# 结尾
\b		# 单词断开 同\<,\>

# 分组引用
((for)(ward)) 
\2 = for
\1 = forward
\3 = ward
\0 == &

正则

image-20241101101131867

基础

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
.					# 匹配单个任意字符(除\n)
[]					# 匹配指定范围的单个字符
[^]					# 匹配指定范围外的单个字符
[:alnum:]			# 匹配字母数字
[:alpha:]			# 匹配字母
[:lower:]			# 匹配小写字母
[:upper:]			# 匹配大写字母
[:blank:]			# 匹配空格与制表符
[:space:]			# 匹配各种空白符
[:cntrl:]			# 匹配不可打印字符
[:digit:]			# 匹配数字
[:xdigit:]			# 匹配十六进制数字
[:graph:]			# 匹配可打印的非空白符
[:print:]			# 匹配可打印字符
[:punct:]			# 匹配标点

\s					# 匹配任何空白符		[\f\r\t\v]
\S					# 匹配任何非空白符		[^\f\r\t\v]
\w					# 匹配任何字符
\W					# 匹配任何非字符
  • 范围匹配
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
ls /etc/ | grep 'rc[.0-6].'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local

ls /etc/ | grep 'rc[.0-6]\.'	# \.匹配一个实际的点号
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

匹配次数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
*			# 任意长度
.*			# 任意字符任意长度
\?			# 长度>=0
\+			# >=1
\{n\}			# =n
\{m,n\}		# >=m,<=n
\{,n\}		# <=n
\{m,\}		# >=m

[root@loong ~]# echo "1 222  3" | grep  "1\{1\}"
1 222  3
[root@loong ~]# echo "1 222  3" | grep  "1\{2\}"
[root@loong ~]# 
[root@loong ~]# echo "1 222  3" | grep  "1\{,2\}"
1 222  3
[root@loong ~]# echo " 222  3" | grep  "1\{,2\}"
 222  3
[root@loong ~]# 

[root@ubuntu2204 ~]# echo -1 -2 123 -123 234 |grep -E '-?[0-9]+'
grep: invalid option -- '?'
Usage: grep [OPTION]... PATTERNS [FILE]...
Try 'grep --help' for more information.
[root@ubuntu2204 ~]# echo -1 -2 123 -123 234 |grep -E '\-?[0-9]+'
-1 -2 123 -123 234
[root@ubuntu2204 ~]# echo -1 -2 123 -123 234 |grep -E -- '-?[0-9]+'
-1 -2 123 -123 234
[root@ubuntu2204 ~]# echo -1 -2 123 -123 234 |grep -E '(-)?[0-9]+'
-1 -2 123 -123 234

# -被识别成选项开头的-
# 使用--结束表示选项的结束

位置锚定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
^				# 开头
$				# 结尾
^pattern$		# 一行是pattern
^$				# 空行
^#				# 开头注释
\<				# 词首
\>				# 词尾
\<pattern\>		# 匹配整个词

#所有非空行
grep -v "^$" /etc/profile
#所有非注释行
grep  "^[^#]" /etc/profile
#排除所有空行和注释行
grep -v "^$" /etc/profile | grep -v "^#" /etc/profile
grep -v '^$\|^#' /etc/profile

image-20241101093041378

分组

():将多个字符捆绑在一起,作为一个整体

引用分组:\1,\2,\3

\0表示匹配到的所有字符

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[root@loong ~]# echo "hello 123" | sed -E 's/([0-9]+)/\1abc/'
hello 123abc

[root@loong ~]# echo "hello 123" | sed -E 's/[0-9]+/\0abc/'
hello 123abc
[root@loong ~]# echo "hello 123" | sed -E 's/[0-9]+/abc/'
hello abc
[root@loong ~]# echo "hello 123" | sed -E 's/[a-z]+/\0abc/'
helloabc 123

echo abcabcabc | grep "\(abc\)\{3\}"

# 前三有.;
ifconfig ens33 | grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" | head -n 1

|:或

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 注意|的范围

#a或b
a\|b

#12a 或 b
12a\|b

#12a 或 12b
12a\|12b
12\(a\|b\)
12[ab]

# 排除空行和#开头的行的四种写法
^# |(管道) ^$
^#\|^$
^\(#\|$\)
^[^#]				
# 匹配开头字符非#的行;空行没有字符,不符合开头字符的前提条件,所有不被匹配到;

[]里的^表示非,^在[]外表示开头