- 11.1 开始之前:什么是正规表示法
- 11.2 基础正规表示法
- 11.2.1 语系对正规表示法的影响
- 11.2.2 grep 的一些进阶选项
- 11.2.3 基础正规表示法练习
- 11.2.4 基础正规表示法字符汇整(characters)
- 11.2.5 sed工具行的新增/删除 , 行的取代/显示 , 搜寻并取代 , 直接改档
- 11.3 延伸正规表示法
- 11.4 文件的格式化与相关处理
- 11.4.1 printf: 格式化列印
- 11.4.2 awk:好用的资料处理工具
- 11.4.3档案比对工具: , diff , cmp , patch
- 11.4.4 档案列印准备工具: pr
- 11.5 重点回顾
- 11.6 本章习题
- 11.7 参考资料与延伸阅读
- 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23885

正则表达式:
正则表达式就是处理字串的方法,他是以为单位来进行字串的处理行为, 正则表达式透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字串的处理程序!

正则表达式的字串表示方式依照不同的严谨度而分为:

  • 基础正则表达式
  • 延伸正则表达式。

正则表达式的教程:

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 文件的格式化与相关处理

https://www.runoob.com/linux/linux-shell-printf.html

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 啰! | | —- |