linux 正则表达式特殊字符,特殊字符,通配符及正则表达式

1.awk ,sed,grep 的单引号问题,可以用双引号吗,可以都不用吗

总的来说,正是因为shell中的meta、wildcard有时会和command中的meta相同,为了让command中的meta不被shell解析以至于改变,就必须用shell quoting(单引号,双引号,反斜线)来保证其文字不变性。

* hard quote:' ' (单引号),凡在hard quote中的所有meta均被关闭。

* soft quote:" " (双引号),在soft quoe中大部份meta都会被关闭,但某些则保留(如$,反引号,反斜杠)。

\$    实现美元标志

\’ 实现反引号的文本化(去除反引号的特殊意义)

\”     实现双引号的文本化(去除双引号的特殊意义)

\\     实现反斜杠的文本化(去除反斜杠的特殊意义)

* escape:\(反斜线),只有紧接在escape (跳脱字符)之后的单一meta才被关闭。

So最好用单引号括起

2.特殊字符分类

100111102031.jpg

re的meta会和shell的meta还有wildcard 相同,所以要转义;

Wildcard

Bash在通配(globbing)中解释特殊字符的行为是可以修改的. set -f命令可以禁用通配(globbing), 而且命令的选项nocaseglob和nullglob可以修改通配(globbing)的行为.

*     匹配 0 或多个字符

?      匹配任意单一字符

[list]              匹配 list 中的任意单一字符

[!list]      匹配不在 list 中的任意单一字符

{string1,string2,...}              匹配 sring1 或 string2 (或更多)其一字符串

例:

a*b  a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。

a?b  a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。

a[xyz]b   a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。

a[!0-9]b  a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。

a{abc,xyz,123}b    a与b之间只能是abc或xyz或123这三个字符串之一。

meta

下面是一些常用的:

IFS  由 或 或 三者之一组成(我们常用 space )。

CR   由 产生。

=     设定变量。

$     作变量或运算替换(请不要与 shell prompt 搞混了)。

>     重导向 stdout。

|      命令管线。

&    重导向 file descriptor ,或将命令置于背境执行。

( )    将其内的命令置于 nested subshell 执行,或用于运算或命令替换。

{ }   将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。

;      在前一个命令结束时,而忽略其返回值,继续执行下一个命令。

&&  在前一个命令结束时,若返回值为 true,继续执行下一个命令。

||      在前一个命令结束时,若返回值为 false,继续执行下一个命令。

!      执行 history 列表中的命令。

Shell Quoting

* hard quote:' ' (单引号),凡在hard quote中的所有meta均被关闭。

* soft quote:" " (双引号),在soft quoe中大部份meta都会被关闭,但某些则保留(如$,反引号,反斜杠)。

* escape:\(反斜线),只有紧接在escape (跳脱字符)之后的单一meta才被关闭。

3.RE正则表达式

Bash本身并不会识别正则表达式. 在脚本中, 使用RE的是命令和工具 -- 比如grep sed和awk -- 这些工具能够解释RE.

一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个规则的。例如:Handel、Händel 和 Haendel 这三个字符串,都可以由“H(a|ä|ae)ndel”这个模式来描述。

^

$

.匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[.\n]”的模式.

\ 将特殊字符的特殊意义去掉(就是RE的特殊字符以及在那些定义了自有的meta的命令)

*星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,“0*42”可以匹配42、042、0042、00042等。

{n,m}

[^]

扩展的正则表达式

+加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等;

?问号代表前面的字符最多只可以出现一次。(0次、或1次)。例如,“colou?r”可以匹配colour或者color;

|竖直分隔符代表选择。例如“gray|grey”可以匹配grey或gray。

()  圆括号可以用来定义操作符的范围和优先度 eg. g(la|oo)d  A(xyz)+C

\

\>表示词尾. 如 abc\> 表示以 abc 结尾的词.???

上述这些构造子都可以自由组合,因此,“H(ae?|ä)ndel”和“H(a|ae|ä)ndel”是相同的。精确的语法可能因不同的工具或程序而异。

注:!在RE中不是特殊字符,是一般的字符;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值