====== - 正则表达式 ======
参考book: The Linux Command Line
这里主要是指POSIX Basic Vs. Extended Regular Expressions,不是指perl用的那一套正则表达式。
POSIX basic 正则表达式一般叫做BRE, -- grep使用的。
POSIX Basic Vs. Extended Regular Expressions叫做ERE, -- egrep使用的, grep -E也是一样。
===== - BRE =====
ERE和BRE都支持以下符号:
^ $ . [ ] *
上面这几个符号默认当特殊功能符号,如果需要匹配这些符号,需要在前面加\转义。
==== - 正常匹配 ====
$ echo "haha [i889" | grep "\[i" # 使用\[来匹配[符号
haha [i889
$ echo "haha [i889^" | grep "\^" # 匹配^字符
haha [i889^
$ echo "haha [i889" | grep "\[i8*" # 匹配到两个8
haha [i889
$ echo "hahai" | grep "\(ha\)i" # 使用括号的时候需要在前面加一个\,
hahai
$ echo "hahai" | grep "\(ha\)\+i" # 使用+的时候也要在前面加一个\
hahai
$ echo "(hahai" | grep "(ha"
(hahai
## ERE和BRE不支持\d类似表达数字的用法,一般建议直接使用[0-9]的方式实现匹配数字,用[a-zA-Z]匹配字母
# 匹配数字
$ echo "hahai89" | grep "hai[0-9]"
hahai89
$ echo "hahai89" | grep "hai[0-9]\+"
hahai89
$ echo "haha i889" | grep "8*"
haha i889
# 匹配字符
$ echo "haha i89" | grep "[a-zA-Z]\+ i89"
haha i89
# 匹配边界,使用\<和\>
$ echo "haha i89" | grep "\"
haha i89
==== - 匹配非 ====
$ echo "haha [i8899" | grep "[^89]" # 匹配除8和9之外的所有字符
haha [i8899
像这种情况下,匹配到的是haha [i, 当前行还是被匹配到的。如果不想匹配带89的行,需要在grep的参数加上-v选项。
==== - grep选中不匹配的行 ====
grep -v选项的解释
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.)
$ echo "haha [i8899" | grep -v "89" # echo中带有89, grep使用了-v参数,所以该行不会被匹配到。
===== - ERE增强 =====
ERE支持BRE的所有规则,另外ERE比BRE多添加了对以下符号的支持:
( ) { } ? + |
注意:ERE多的这几个符号默认是当做特殊功能字符,如要其要被当前普通字符被匹配,需要在其前面加\进行转义。
$ echo "haha [i889" | grep -E "(88)" # 匹配88, ()只起限定范围的使用
haha [i889
$ echo "haha [i889" | grep -E "89\>" # 匹配边界
haha [i889
$ echo "haha [i889" | grep -E "8+" # 匹配到两个8
haha [i889
$ echo "haha [i8899" | grep -E "88|99" # 匹配88或者99
haha [i8899
$ echo "haha) [i889" | grep -E "haha\)" # 匹配)符号
haha) [i889
{n} Match the preceding element if it occurs exactly n times.
{n,m} Match the preceding element if it occurs at least n times, but no
more than m times.
{n,} Match the preceding element if it occurs n or more times.
{,m} Match the preceding element if it occurs no more than m times.
===== - sed命令 =====
sed 's/regexp/replacement/' distros.txt
# regexp expand方式的匹配,可以理解为ERE
sed -r 's/(regexp)/new_\1' distros.txt
# 和上面效果一样,是普通的regexp, 可以理解为BRE
sed 's/\(regexp\)/new_\1/' distros.txt
# -i, 将替换后的结果写回原文件中
sed -i 's/\(regexp\)/new_\1/' distros.txt