首页 > 代码库 > 万用字元与特殊符号及正则表示字符

万用字元与特殊符号及正则表示字符

万用字元与特殊符号及正则表示字符

  万用字元: 

符号 意义
* 代表‘ 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)在行首!
范例:搜寻行首为 # 开始的那一行,并列出行号
grep -n ‘^#‘ regular_express.txt
word$ 意义:待搜寻的字串(word)在行尾!
范例:将行尾为 ! 的那一行列印出来,并列出行号
grep -n ‘!$‘ regular_express.txt
. 意义:代表‘一定有一个任意字元’的字符!
范例:搜寻的字串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间‘一定’仅有一个字元,而空白字元也是字元!
grep -n ‘e.e‘ regular_express.txt
\ 意义:跳脱字符,将特殊符号的特殊意义去除!
范例:搜寻含有单引号 ‘ 的那一行!
grep -n \‘ regular_express.txt
* 意义:重复零个到无穷多个的前一个 RE 字符
范例:找出含有 (es) (ess) (esss) 等等的字串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字串。另外,因为 * 为重复‘前一个 RE 字符’的符号, 因此,在 * 之前必须要紧接着一个 RE 字符喔!例如任意字元则为 ‘.*’ !
grep -n ‘ess*‘ regular_express.txt
[list] 意义:字元集合的 RE 字符,里面列出想要撷取的字元!
范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中‘谨代表一个待搜寻的字元’, 例如‘ a[afl]y ’代表搜寻的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!
grep -n ‘g[ld]‘ regular_express.txt
[n1-n2] 意义:字元集合的 RE 字符,里面列出想要撷取的字元范围!
范例:搜寻含有任意数字的那一行!需特别留意,在字元集合 [] 中的减号 - 是有特殊意义的,他代表两个字元之间的所有连续字元!但这个连续与否与 ASCII 编码有关,因此,你的编码需要设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变数是否正确!) 例如所有大写字元则为 [A-Z]
grep -n ‘[0-9]‘ regular_express.txt
[^list] 意义:字元集合的 RE 字符,里面列出不要的字串或范围!
范例:搜寻的字串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是‘反向选择’的意思。 例如,我不要大写字元,则为 [^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该档案内的所有行都被列出,为什么?因为这个 [^A-Z] 是‘非大写字元’的意思, 因为每一行均有非大写字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字
grep -n ‘oo[^t]‘ regular_express.txt
\{n,m\} 意义:连续 n 到 m 个的‘前一个 RE 字符’
意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符,
意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符!
范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog)
grep -n ‘go\{2,3\}g‘ regular_express.txt

  说明

  ‘正规表示法的特殊字元’与一般在指令列输入指令的‘万用字元’并不相同, 例如,在万用字元当中的 * 代表的是‘ 0 ~ 无限多个字元’的意思,但是在正规表示法当中, * 则是‘重复 0 到无穷多个的前一个 RE 字符’的意思~使用的意义并不相同,不要搞混了!

  举例来说,不支援正规表示法的 ls 这个工具中,若我们使用 ‘ls -l * ’ 代表的是任意档名的档案,而 ‘ls -l a* ’代表的是以 a 为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头的档案,则必须要这样:(需搭配支援正规表示法的工具)

ls | grep -n ‘^a.*‘
例题:
以 ls -l 配合 grep 找出 /etc/ 底下档案类型为连结档属性的档名
答:
由于 ls -l 列出连结档时标头会是‘ lrwxrwxrwx ’,因此使用如下的指令即可找出结果:
ls -l /etc | grep ‘^l‘
若仅想要列出几个档案,再以‘ |wc -l ’ 来累加处理即可。  

万用字元与特殊符号及正则表示字符