8.正规表示法本章同步视频:https://edu.51cto.com/sd/e4874

8.4 文件的格式化与相关处理

8.4.2 diff - compare files line by line

1.语法

[root@localhost tmp]# diff <变动前的文件> <变动后的文件>

2.一般格式比较

[root@localhost tmp]# cat a

a

b

c

[root@localhost tmp]# cat b

a

b

c

d

[root@localhost tmp]# diff a b

3a4       #第一个文件的第3行后面需要增加第二个文件的第4行

> d        #这一行的内容是d

[root@localhost tmp]# diff b a

4d3      #第一个文件的第四行需要删除,然后匹配到第二个文件的第3行

< d       #这一行的内容是d

[root@localhost tmp]# cat a

a

a

a

[root@localhost tmp]# cat b

a

b

b

a

[root@localhost tmp]# diff a b

2c2,3       #将第一个文件的第2行,换成第二个文件的第2,3行

< a          #第一个文件的第二行内容

---            #分隔符

> b          #第二个文件的第二行内容

> b          #第二个文件的第三行内容

#注:本质上,diff,用于如何更改第一个文件使其与第二个文件相同。

l  a是增加,d是删除,c是替换。

l  < 表示第一个文件的内容

l  > 表示第二个文件的内容

3.context mode

[root@localhost tmp]# diff -c a b

*** a 2020-04-26 10:08:07.335362393 -0400     #from file说明

--- b 2020-04-26 10:07:56.492361507 -0400     #to file说明

***************    #分隔符

*** 1,4 ****       #from file的处理范围是1-4行

  a

  b

- c                   #-,表示需要删除

  e

--- 1,6 ----       #to file的处理范围是1-6行

  a

+ f                    #+是需要增加的行

  b

  e

+ c

+ d

4.Unified Mode

[root@localhost tmp]# diff -u a b

--- a 2020-04-26 10:08:07.335362393 -0400

+++ b 2020-04-26 10:07:56.492361507 -0400

@@ -1,4 +1,6 @@

 a

+f        #需要增加的

 b

-c        #需要删除的

 e

+c

+d

5.比较目录

[root@localhost tmp]# mkdir a

[root@localhost tmp]# mkdir b

[root@localhost tmp]# touch  a/{aa,cc,dd}

[root@localhost tmp]# touch  b/{aa,ee,dd,ff}

[root@localhost tmp]# diff a b

Only in a: cc      #输出两个目录中独有的内容

Only in b: ee

Only in b: ff

[root@localhost tmp]# diff  b a

Only in a: cc    #参数顺序不重要

Only in b: ee

Only in b: ff

8.4.3 cmp

1.cmp - compare two files byte by byte

[dmtsai@study ~]$ cmp [-l] file1 file2

选项与参数:

-l  :将所有的不同点的字节处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。

2.用法

[root@localhost tmp]# cat a

aaa

bbb

ccc

ddd

[root@localhost tmp]# cat b

aaa

bbc

cdd

dff

[root@localhost tmp]# cmp a b

a b differ: byte 7, line 2    #默认只显示第一个不同

[root@localhost tmp]# cmp -l a b

 7 142 143        #以字符ASCII的形式显示全部不同

10 143 144

11 143 144

14 144 146

15 144 146

[root@localhost tmp]# cmp -lb a b

 7 142 b    143 c      #-b,显示不同的字符

10 143 c    144 d

11 143 c    144 d

14 144 d    146 f

15 144 d    146 f

8.4.4 patch - apply a diff file to an original

       patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。

      patch 这个指令与 diff 可是有密不可分的关系!diff 可以用来分辨两个版本之间的差异,patch就是『将旧的档案升级成为新的档案』!就是『先比较先旧版本的差异,并将差异档制作成为补丁档,再由补丁档更新旧档案』即可。

1.语法

[dmtsai@study ~]$ patch -pN < patch_file   <==更新

[dmtsai@study ~]$ patch -R -pN < patch_file<==还原

选项与参数:

-p  :后面可以接『取消几层目录』的意思。

-R  :代表还原,将新的文件还原成原来旧的版本。

2.用法

[root@localhost tmp]# cat a

aaa

bbb

ccc

ddd

[root@localhost tmp]# cat b

aaa

bbc

cdd

dff

[root@localhost tmp]# diff -u  a b >ab.patch   #获取差异

[root@localhost tmp]# patch -p0 < ab.patch   #更新旧文件a

patching file a

[root@localhost tmp]# cat a

aaa

bbc

cdd

dff

[root@localhost tmp]# cat b

aaa

bbc

cdd

dff

[root@localhost tmp]# patch -R -p0 < ab.patch    #还原旧文件a

patching file a

#注:该操作需要在更新后完成。

[root@localhost tmp]# cat a

aaa

bbb

ccc

ddd

[root@localhost tmp]# cat b

aaa

bbc

cdd

dff

8.5 总结

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

l  只要工具程序支持正规表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用;常见的支持正规表示法的工具软件有: grep ,  vim 等等。

l  正规表示法与通配符是完全不一样的东西!通配符 (wildcard) 代表的是 bash 操作接口的一个功能, 但正规表示法则是一种字符串处理的表示方式!

l  文件的比对中,可利用 diff 及 cmp 进行比对,其中 diff 主要用在纯文本档案方面的新旧版本比对