您的位置:首页 > 其它

12 正规表示法与文件格式化处理

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

正规表示法基本上是一种『表示法』, 只要工具程序支持这种表示法,那么该工具程序就可以用来作为正规表示法的字串处理之用。 例如 vi, grep, awk ,sed 等等工具,因为她们支持正规表示法, 所以,这些工具就可以使用正规表示法的特殊字节来进行字串的处理。但例如 cp, ls 等命令并未支持正规表示法, 所以就只能使用 bash 自己本身的通配符而已。

『正规表示法与通配符是完全不一样的东西!』 这很重要!因为『通配符代表的是bash 操作介面的一个功能』,但正规表示法则是一种字串处理的表示方式!

特殊符号

[: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 的数字与字节

grep [-A] [-B] [--color=auto] '搜寻字串' filename

选项与参数:

-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;

-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;

--color=auto 可将正确的那个选取数据列出颜色

grep 在数据中查寻一个字串时,是以 "整行" 为单位来进行数据的选取的!

行首与行尾字节 ^ $

那个 ^ 符号,在字节集合符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义。

因为小数点具有其他意义(,所以必须要使用跳脱字节(\)来加以解除其特殊意义!

. (小数点):代表『一定有一个任意字节』的意思;

* (星号):代表『重复前一个字节, 0 到无穷多次』的意思,为组合形态

限定连续 RE 字符范围 {}

因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用转义字符 \ 来让他失去特殊意义才行。 至于 {} 的语法是这样的,假设我要找到两个 o 的字串,可以是:

grep -n 'o\{2\}' regular_express.txt

基础正规表示法字符汇整



强调:『正规表示法的特殊字节』与一般在命令列输入命令的『通配符』并不相同, 例如,在通配符当中的 * 代表的是『 0 ~ 无限多个字节』的意思,但是在正规表示法当中, * 则是『重复 0 到无穷多个的前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!

举例来说,不支持正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』 代表的是任意档名的文件,而 『ls -l a* 』代表的是以 a 为开头的任何档名的文件, 但在正规表示法中,我们要找到含有以 a 为开头的文件,则必须要这样:(需搭配支持正规表示法的工具) ls | grep -n '^a.*'

e.g.以 ls -l 配合 grep 找出 /etc/ 底下文件类型为连结档属性的档名:

答:由于 ls -l 列出连结档时标头会是『 lrwxrwxrwx 』,因此使用如下的命令即可找出结果:ls -l /etc | grep '^l' 若仅想要列出几个文件,再以『 | wc -l 』 来累加处理即可。

sed 工具

sed 本身也是一个管线命令,可以分析 standard input ! 而且 sed 还可以将数据进行取代、删除、新增、选取特定行等等的功能。

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 就是啦!

部分数据的搜寻并取代的功能

sed 's/要被取代的字串/新的字串/g'

延伸正规表示法

grep -v '^$' regular_express.txt | grep -v '^#'需要使用到管线命令来搜寻两次!那么如果使用延伸型的正规表示法,我们可以简化为:

egrep -v '^$|^#' regular_express.txt

延伸型正规表示法有哪几个特殊符号:



文件的格式化与相关处理

格式化列印: printf

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 罗!

awk:好用的数据处理工具。$0 代表『一整列数据』的意思

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

awk 主要是处理『每一行的栏位内的数据』,而默认的『栏位的分隔符号为 "空白键" 或 "[tab]键" 』!

awk 的处理流程是:

读入第一行,并将第一行的数据填入 $0, $1, $2.... 等变量当中;
依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
做完所有的动作与条件类型;
若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

awk 是『以行为一次处理的单位』, 而『以栏位为最小的处理单位』。

awk 的内建变量

NF 每一行 ($0) 拥有的栏位总数
NR 目前 awk 所处理的是『第几行』数据
FS 目前的分隔字节,默认是空白键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: