• 正则表达式与文件格式化处理


    一、基础正则表达式

      1、语系对正则表达式的影响

        由于语系的编码数据并不相同,所以就会造成数据选取结果的区别。举例来说, 在英文大小写的编码顺序中,zh_CN.big5及C这两种语系的输出结果分别如下:

          LANG=C时,0 1 2 ...A B C ... Z a b c...z

          LANG=zh_CN时, 0 1 2...a A b B c C ... z Z

        特殊符号表:

    特殊符号 代表意义
    [: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:] 代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符

       2、grep的一些高级参数

         grep [-A] [-B] [--color==auto] ‘搜寻字符串’ filename

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

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

       

      注: ^在[]内代表“反向选择”, 在[]之外代表定位在行首的意义。

      .(小数点): 代表一定有一个任意字符的意思

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

      “.*”: 代表零个或多个任意字符的意思。

      限定连续RE字符范围{}:

          因为{与}的符号在shell是有特殊意义的,因此我们必须用转义字符

          如: grep -n 'o{2}' regular_express.txt    找到两个o的字符串

        3、基础正则表达式字符(characters)

    RE字符 意义
    ^word 待查找的字符串(word)在行首
    word$ 将查找的字符串(word)在行尾
    . 代表一定有一个任意字符的字符
    转义字符,将特殊符号得特殊意义去除
    * 重复零个到无穷多个的前一个字符
    [list] 从字符集合的RE字符里面找出想要选取的字符
    [n1-n2] 从字符集合的RE字符里面找出想要选取的字符范围
    [^list] 从字符集合的RE字符里面找出不要的字符串或范围
    {n,m} 连续n到m个的前一个RE字符, 若为{n}则是连续n个的前一个RE字符, 若为{n,}则是连续n个以上的前一个RE字符

    二、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: 删除,后面通常不接任何参数

              i: 插入, i 的后面可以接字符串, 而这些字符串会在新的一行出现(目前的上一行)

            p: 打印, 也就是将某个选择的数据打印出来。通常p会与参数sed -n一起运行

            s: 替换,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式!

       sed的几个功能:

        a、以行为单位的新增/删除功能

        b、以行为单位的替换与显示功能

        c、部分数据的查找并替换的功能

            除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换的功能。基本行sed的查找与替换的与vi相当类似,它有点像这样:

            sed 's//要被替换的字符串/新的字符串g'

         d、直接修改文件内容(危险操作)

          sed甚至可以直接修改文件的内容,而不必使用管道命令或数据流重定向。

            例: sed -i 's/.$/!/g' regular_express.txt

          sed的“-i”参数可以直接修改文件内容

    三、扩展正则表达式

        grep默认仅支持基础正则表达式,如果要使用扩展型正则表达式,可以使用grep -E 不过建议直接使用egrep

     RE字符 意义与范例 
     +

    意义:重复一个或一个以上的前一个RE字符

    范例:查找(god)(good)(goood)等的字符串。那个o+代表一个以上的o,:

      egrep -n 'go+d' regular_express.txt

     ?

    意义:零个或一个的前一个RE字符

    范例: 查找gd或god这两个字符串:

      egrep -n 'go?d' regular_express.txt

     |

    意义: 用或(or)的方式找出数个字符串

    范例:查找gd或good这两个字符串

    egrep -n 'gd|good' regular_express.txt 

     ()

    意义:找出“组”字符串

    范例: 查找(glad)或(good)这两个字符串

      egrep -n 'g(la|oo)d' regular_express.txt 

     ()+

    意义:多个重复组的判别

    范例: echo 'AxyzxyzxyzC' | egrep 'A(xyz)+C' 

     四、文件的格式化与相关处理

       1、格式化打印:printf

         printf '打印格式' 实际内容

        参数: 

          关于格式方面的几个特殊样式:

            a   警告声音输出

               退格键(backspace)

             f   清除屏幕(form feed)

                输出新的一行

                亦即Enter按键

                水平的[tab]按键

            v    垂直的[tab]按键

            xNN  NN为两位数的数字,可以转换数字成为字符

          关于C程序语言内, 常见的变量格式:

            %ns  那个n是数字,s代表string, 即多少个字符

            %ni  那个n是数字, i代表integer,即多少整数字数

            %N.nf 那个n与N都是数字,f代表floating(浮点)N代表数位,n代表有几个小数位

        2、awk:好用的数据处理工具

          awk:比较倾向于将一行分成数个‘字段’来处理,适合处理小型的数据数据处理

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

          如: last -n 5 | awk '{print $1 " " $3}'

          整个awk的处理流程:

            a. 读入第一行, 并将第一行的数据填入$0, $1,$2等变量中, $0代表一整行数据的意思

            b. 依据条件类型的限制, 判断是否需要进行后面的动作

            c. 做完所有的动作与条件类型

            d.  若还有后续的“行”的数据, 则重复上面1~3的步骤,直到所有的数据都读完为止

           awk是以行为一次处理的单位, 而以字段为最小的处理单位

          awk的内置变量:

    变量名称 代表意义
    NF

    第一行($0)拥有的字段总数

    NR 目前awk所处理的是“第几行”数据
    FS 目前的分隔字符,默认是空格键

           

         

      awk的条件类型: 逻辑运算符

    运算符 代表意义
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    == 等于
    != 不等于

           与bash shell 的变量不同,在awk中, 变量可以直接使用,不需要加上$符号

           awk的动作内{}也是支持if(条件)的

        3、文件比较工具

          a、diff: 就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,通常是用在同一的文件(或软件)的新旧版本区别上。

             diff [-bBi] from-file to-file

              参数: from-file: 一个文件名, 作为欲比较文件的文件名

                  to-file: 一个文件名, 作为目的比较文件的文件名

                  注意, from-file或to-file可以用-替换,代表standard input

                  -b: 忽略一行当中仅有多个空白的区别

                  -B: 忽略空白行的区别

                  -i: 忽略大小写的不同

             diff 也可以比较整个目录下的区别

          b、cmp: 主要也是比较两个文件,它主要利用“字节”单位去比较,也可以比较二进制文件

            cmp [-s] file1 file2

           参数:

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

          

          c、 patch: diff可以用来分辨两个版本之间的区别,而patch就可以将旧的文件升级为新的文件:

              先将比较新旧版本的区别,并将区别文件制作成为补丁文件,再由补丁文件更新旧文件即可。

            patch -pN < patch_file   <==更新

            patch -R -pN < patch_file   <==还原

            -p: 后面的N表示取消几层目录的意思

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

           例:制作补丁文件:

              diff -Naur passwd.old passwd.new > passwd.patch

             将patch file用来更新旧的数据

                patch -p0 < passwd.patch

              恢复旧文件的内容

                patch -R -p0 < passwd.patch

        4、文件打印准备:pr

            

       

  • 相关阅读:
    redis 学习笔记
    导数据方法
    数据库常用操作
    zepto.js
    shopnc
    vue.js
    laravel
    mysql进阶学习
    Python基础------生成器表达式形式、面向过程编程、内置函数部分
    Python基础----生成器、三元表达式、列表生成式、生成器表达式
  • 原文地址:https://www.cnblogs.com/SamLXW/p/6222773.html
Copyright © 2020-2023  润新知