全部博文(48)
分类:
2009-12-02 00:44:13
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.特殊字符分类
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 由
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 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中不是特殊字符,是一般的字符;