Chinaunix首页 | 论坛 | 博客

14#

  • 博客访问: 171058
  • 博文数量: 48
  • 博客积分: 1910
  • 博客等级: 上尉
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-27 10:38
文章存档

2012年(8)

2011年(2)

2010年(13)

2009年(25)

我的朋友

分类:

2009-12-02 00:44:13

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

 

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

  * hard quote:' ' (单引号),凡在hard quote中的所有meta均被关闭。
       * soft quote:" " (双引号),在soft quoe中大部份meta都会被关闭,但某些则保留(如$,反引号,反斜杠)。
            \$    实现美元标志 
            \’ 实现反引号的文本化(去除反引号的特殊意义)
            \”     实现双引号的文本化(去除双引号的特殊意义)
            \\     实现反斜杠的文本化(去除反斜杠的特殊意义)

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

So最好用单引号括起

 

 

2.特殊字符分类

 

 

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

 

Wildcard

 

Bash在通配(globbing)中解释特殊字符的行为是可以修改的. set -f命令可以禁用通配(globbing), 而且命令的选项nocaseglobnullglob可以修改通配(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。

<     重导向 stdin。

|      命令管线。

&    重导向 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 sedawk -- 这些工具能够解释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中不是特殊字符,是一般的字符;

 

阅读(910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~