万用字元与特殊符号及正则表示字符
万用字元:
符号 | 意义 |
* | 代表‘ 0 个到无穷多个’任意字元 |
? | 代表‘一定有一个’任意字元 |
[ ] | 同样代表‘一定有一个在括号内’的字元(非任意字元)。例如 [abcd] 代表‘一定有一个字元, 可能是 a, b, c, d 这四个任何一个’ |
[ - ] | 若有减号在中括号内时,代表‘在编码顺序内的所有字元’。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
[^ ] | 若中括号内的第一个字元为指数符号 (^) ,那表示‘反向选择’,例如 [^abc] 代表 一定有一个字元,只要是非 a, b, c 的其他字元就接受的意思。 |
bash 环境中的特殊符号:
符号 | 内容 |
# | 注解符号:这个最常被使用在 script 当中,视为说明!在后的资料均不执行 |
\ | 跳脱符号:将‘特殊字元或万用字元’还原成一般字元 |
| | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); |
; | 连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 使用者的家目录 |
$ | 取用变数前置字元:亦即是变数之前需要加的变数取代值 |
& | 工作控制 (job control):将指令变成背景下工作 |
! | 逻辑运算意义上的‘非’ not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 资料流重导向:输出导向,分别是‘取代’与‘累加’ |
<, << | 资料流重导向:输入导向 (这两个留待下节介绍) |
‘ ‘ | 单引号,不具有变数置换的功能 |
" " | 具有变数置换的功能! |
` ` | 两个‘ ` ’中间为可以先执行的指令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合! |
特殊符号 | 代表意义 |
[:alnum:] | 代表英文大小写字元及数字,亦即 0-9, A-Z, a-z |
[:alpha:] | 代表任何英文大小写字元,亦即 A-Z, a-z |
[:blank:] | 代表空白键与 [Tab] 按键两者 |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] | 代表数字而已,亦即 0-9 |
[:graph:] | 除了空白字元 (空白键与 [Tab] 按键) 外的其他所有按键 |
[:lower:] | 代表小写字元,亦即 a-z |
[:print:] | 代表任何可以被列印出来的字元 |
[:punct:] | 代表标点符号 (punctuation symbol),亦即:" ‘ ? ! ; : # $... |
[:upper:] | 代表大写字元,亦即 A-Z |
[:space:] | 任何会产生空白的字元,包括空白键, [Tab], CR 等等 |
[:xdigit:] | 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字元 |
基础正则表示法字符汇整 (characters):
正则表示法特殊字符汇整如下:
RE 字符 | 意义与范例 |
^word | 意义:待搜寻的字串(word)在行首! 范例:搜寻行首为 # 开始的那一行,并列出行号
|
word$ | 意义:待搜寻的字串(word)在行尾! 范例:将行尾为 ! 的那一行列印出来,并列出行号
|
. | 意义:代表‘一定有一个任意字元’的字符! 范例:搜寻的字串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间‘一定’仅有一个字元,而空白字元也是字元!
|
\ | 意义:跳脱字符,将特殊符号的特殊意义去除! 范例:搜寻含有单引号 ‘ 的那一行!
|
* | 意义:重复零个到无穷多个的前一个 RE 字符 范例:找出含有 (es) (ess) (esss) 等等的字串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字串。另外,因为 * 为重复‘前一个 RE 字符’的符号, 因此,在 * 之前必须要紧接着一个 RE 字符喔!例如任意字元则为 ‘.*’ !
|
[list] | 意义:字元集合的 RE 字符,里面列出想要撷取的字元! 范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中‘谨代表一个待搜寻的字元’, 例如‘ a[afl]y ’代表搜寻的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!
|
[n1-n2] | 意义:字元集合的 RE 字符,里面列出想要撷取的字元范围! 范例:搜寻含有任意数字的那一行!需特别留意,在字元集合 [] 中的减号 - 是有特殊意义的,他代表两个字元之间的所有连续字元!但这个连续与否与 ASCII 编码有关,因此,你的编码需要设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变数是否正确!) 例如所有大写字元则为 [A-Z]
|
[^list] | 意义:字元集合的 RE 字符,里面列出不要的字串或范围! 范例:搜寻的字串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是‘反向选择’的意思。 例如,我不要大写字元,则为 [^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该档案内的所有行都被列出,为什么?因为这个 [^A-Z] 是‘非大写字元’的意思, 因为每一行均有非大写字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字
|
\{n,m\} | 意义:连续 n 到 m 个的‘前一个 RE 字符’ 意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符, 意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符! 范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog)
|
说明:
‘正规表示法的特殊字元’与一般在指令列输入指令的‘万用字元’并不相同,
例如,在万用字元当中的 * 代表的是‘ 0 ~ 无限多个字元’的意思,但是在正规表示法当中, * 则是‘重复 0 到无穷多个的前一个 RE
字符’的意思~使用的意义并不相同,不要搞混了!
举例来说,不支援正规表示法的 ls 这个工具中,若我们使用 ‘ls -l * ’ 代表的是任意档名的档案,而 ‘ls -l a* ’代表的是以 a
为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头的档案,则必须要这样:(需搭配支援正规表示法的工具)
ls | grep -n ‘^a.*‘
例题:
以 ls -l 配合 grep 找出 /etc/ 底下档案类型为连结档属性的档名 答: 由于 ls -l 列出连结档时标头会是‘ lrwxrwxrwx ’,因此使用如下的指令即可找出结果:
若仅想要列出几个档案,再以‘ |wc -l ’ 来累加处理即可。 |