正则表达式:
正则表达式就是处理字串的方法,他是以行为单位来进行字串的处理行为, 正则表达式透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字串的处理程序!
正则表达式的字串表示方式依照不同的严谨度而分为:
- 基础正则表达式
- 延伸正则表达式。
11.2 基础正则表达式
既然正则表达式是处理字串的一种表示方式,那么对字元排序有影响的语系资料就会对正则表达式的结果有影响!
11.2.1 语系对正则表达式的影响
为什么语系的资料会影响到正则表达式的输出结果呢?我们在第零章计算机概论的文字编码系统里面谈到,档案其实记录的仅有0与1,我们看到的字元文字与数字都是透过编码表转换来的。由于不同语系的编码资料并不相同,所以就会造成资料撷取结果的差异了。举例来说,在英文大小写的编码顺序中,zh_TW.big5及C这两种语系的输出结果分别如下:
- LANG=C 时:0 1 2 3 4 … ABCD … Z abcd …z
- LANG=zh_TW 时:0 1 2 3 4 … a A b B c C d D … z Z
上面的顺序是编码的顺序,我们可以很清楚的发现这两种语系明显就是不一样!
如果你想要撷取大写字元而使用[AZ]时,会发现LANG=C确实可以仅捉到大写字元(因为是连续的) ,但是如果LANG=zh_TW.big5时,就会发现到,连同小写的bz也会被撷取出来!因为就编码的顺序来看, big5语系可以撷取到『 A b B c C … z Z 』这一堆字元!
所以,使用正则表达式时,需要特别留意当时环境的语系为何,否则可能会发现与别人不相同的撷取结果喔!
由于一般我们在练习正则表达式时,使用的是相容于POSIX的标准,因此就使用『 C 』这个语系( 注1 )!因此,底下的很多练习都是使用『 LANG=C 』这个语系资料来进行的喔!
另外,为了要避免这样编码所造成的英文与数字的撷取问题,因此有些特殊的符号我们得要了解一下的!这些符号主要有底下这些意义:( 注1 )
| 特殊符号 | 代表意义 |
|---|---|
| [:alnum:] | 代表英文大小写字元及数字,亦即0-9, AZ, az |
| [:alpha:] | 代表任何英文大小写字元,亦即AZ, az |
| [:blank:] | 代表空白键与[Tab] 按键两者 |
| [:cntrl:] | 代表键盘上面的控制按键,亦即包括CR, LF, Tab, Del.. 等等 |
| [:digit:] | 代表数字而已,亦即0-9 |
| [:graph:] | 除了空白字元(空白键与[Tab] 按键) 外的其他所有按键 |
| [:lower:] | 代表小写字元,亦即az |
| [:print:] | 代表任何可以被列印出来的字元 |
| [:punct:] | 代表标点符号(punctuation symbol),亦即:” ‘ ? ! ; : # $… |
| [:upper:] | 代表大写字元,亦即AZ |
| [:space:] | 任何会产生空白的字元,包括空白键, [Tab], CR 等等 |
| [:xdigit:] | 代表16 进位的数字类型,因此包括: 0-9, AF, af 的数字与字元 |
11.2.2 grep 的一些进阶选项
我们在第十章BASH里面的grep谈论过一些基础用法,但其实grep还有不少的进阶用法喔!底下我们仅列出较进阶的grep选项与参数给大家参考, 基础的grep用法请参考前一章的说明!
| [dmtsai@study ~]$ grep [-A] [-B] [—color=auto] ‘搜寻字串’ filename 选项与参数: -A :后面可加数字,为after 的意思,除了列出该行外,后续的n 行也列出来; -B :后面可加数字,为befer 的意思,除了列出该行外,前面的n 行也列出来; —color=auto 可将正确的那个撷取资料列出颜色
范例一:用dmesg列出核心讯息,再以grep找出内含qxl那行 [dmtsai@study ~]$ dmesg | grep ‘qxl’ [ 0.522749] [drm] qxl: 16M of VRAM memory size [ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain) [ 0.522750] [drm] qxl: 32M of Surface memory size [ 0.650714] fbcon: qxldrmfb (fb0) is primary device [ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
dmesg 可列出核心产生的讯息!包括硬体侦测的流程也会显示出来。
鸟哥使用的显卡是QXL 这个虚拟卡,透过grep 来qxl 的相关资讯,可发现如上资讯。
范例二:承上题,要将捉到的关键字显色,且加上行号来表示: [dmtsai@study ~]$ dmesg | grep -n —color=auto ‘qxl’ 515:[ 0.522749] [ drm] qxl : 16M of VRAM memory size 516:[ 0.522750] [drm] qxl : 63M of IO pages memory ready (VRAM domain) 517:[ 0.522750] [drm] qxl : 32M of Surface memory size 529:[ 0.650714] fbcon: qxl drmfb (fb0) is primary device 539:[ 0.668487] qxl 0000:00:02.0: fb0: qxl drmfb frame buffer device
除了qxl会有特殊颜色来表示之外,最前面还有行号喔!其实颜色显示已经是预设在alias当中了!
范例三:承上题,在关键字所在行的前两行与后三行也一起捉出来显示 [dmtsai@study ~]$ dmesg | grep -n -A3 -B2 —color=auto ‘qxl’
你会发现关键字之前与之后的数行也被显示出来!这样可以让你将关键字前后资料捉出来进行分析啦! |
| —- |
grep是一个很常见也很常用的指令,他最重要的功能就是进行字串资料的比对,然后将符合使用者需求的字串列印出来。
『grep在资料中查寻一个字串时,是以”整行”为单位来进行资料的撷取的!』
11.2.3 基础正规表示法练习
底下的练习大前提是:
- 语系已经使用『 export LANG=C; export LC_ALL=C 』的设定值;
- grep 已经使用alias 设定成为『 grep —color=auto 』
例题一、搜寻特定字串
例题二、**利用中括号[] **来搜寻集合字元
具体练习,请看原文:http://linux.vbird.org/linux_basic/0330regularex.php#basicre
11.2.5 sed 工具
sed 本身也是一个管线命令,可以分析standard input ,sed 还可以将资料进行取代、删除、新增、撷取特定行等等的功能。
| [dmtsai@study ~]$ sed [-nefr] ‘[动作]’ 选项与参数: -n :使用安静(silent)模式。在一般sed 的用法中,所有来自STDIN 的资料一般都会被列出到萤幕上。 但如果加上-n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在指令列模式上进行sed 的动作编辑; -f :直接将sed 的动作写在一个档案内, -f filename 则可以执行filename 内的sed 动作; -r :sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i :直接修改读取的档案内容,而不是由萤幕输出。
动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 是需要在10 到20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代n1,n2 之间的行! d :删除,因为是删除啊,所以d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的资料印出。通常p 会与参数sed -n 一起运作~ s :取代,可以直接进行取代的工作哩!通常这个s 的动作可以搭配正规表示法! 例如1,20s/old/new/g 就是啦! | | —- |
练习:见原文
- 以行为单位的新增/删除功能
- 部分资料的搜寻并取代的功能
- 直接修改档案内容(危险动作)
11.4 文件的格式化与相关处理
printf 可以帮我们将资料输出的结果格式化,而且而支援一些特殊的字符
| [dmtsai@study ~]$ printf ‘列印格式’实际内容 选项与参数: 关于格式方面的几个特殊样式: \a 警告声音输出 \b 倒退键(backspace) \f 清除萤幕(form feed) \n 输出新的一行 \r 亦即Enter 按键 \t 水平的[tab] 按键 \v 垂直的[tab] 按键 \xNN NN 为两位数的数字,可以转换数字成为字元。 关于C 程式语言内,常见的变数格式 %ns 那个n 是数字, s 代表string ,亦即多少个字元; %ni 那个n 是数字, i 代表integer ,亦即多少整数位数; %N.nf 那个n 与N 都是数字, f 代表floating (浮点),如果有小数位数, 假设我共要十个位数,但小数点有两位,即为%10.2f 啰! | | —- |
