A gentleman is open-minded and optimistic; a small person is narrow-minded and pessimistic.

  "君子坦荡荡,小人长戚戚"

参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)

一、正则表达式基础

  1、什么是正则表达式

    正则表达式(Regular Expression, RE)是对字符串操作的一种逻辑公式,就是用一些事先定义好的特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

  2、为什么要学习正则表达式

    由于其强大的字符串处理能力,目前许多工具和编程语言都支持正则表达式,熟练掌握它可以帮助我们更高效的完成工作

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

    由于不同的语系其编码顺序不一样,导致正则表达式的匹配结果可能不一样,所以在使用之前应该先确认当前的语系,也可以使用下面这些特殊符号来避免不同语系带来的问题:

特殊符号 代表意义
[: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:] 标点符号,即 ",',?,!,;,:,#,$
[:upper:] 大写字母,A-Z
[:space:] 任何会产生空白的字符,包括空格键[Tab] CR等
[:xdigit:] 十六进制的数字类型,包括0-9,A-F,a-f

  4、基础正则表达式字符

RE字符 意义与范例
^word

意义:以word开头

范例:查找以'#'开头的那一行

grep -n '^#' filename

word$

意义:以word结尾

范例:查找以'!'结尾的那一行

grep -n '!$' filename

.

意义:代表一定有一个任意字符的字符

范例:查找包含字符'a'并且'a'后面至少有一个字符的那一行

grep -n 'a.' filename

\

意义:转义字符,将特殊符号的特殊意义去除

范例:查找包含单引号的那一行

grep -n \' filename

*

意义:重复零到无穷多个的前一个字符

范例:查找包含(es)(ess)(esss)等字符串所在的行

grep -n 'ess*' filename

[list]

意义:list中的任意一个字符都可以被匹配

范例:查找包含'get'或者'got'的行

grep -n 'g[eo]t' filename

[n1-n2]

意义:n1-n2范围内的任意一个字符都可以被匹配

范例:查找包含数字的那一行

grep -n '[0-9]' filename

[^list]

意义:不包含在list中的其他任意一个字符

范例:查找不包含大写字母的那一行

grep -n '[^A-Z]' filename

\{n,m\}

意义:连续n到m个的前一个字符,若为\{n\}则是连续n个前一个字符,

\{n,\}为连续n到无穷多个前一个字符

范例:查找包含'goog'或者'gooog'的那一行

grep -n 'go\{2,3\}g' filename

  5、扩展正则表达式

    扩展正则表达式可以通过组合功能,将多次查找变为一次查找,使用 grep -E 或者 egrep 来支持扩展正则表达式

  6、扩展正则表达式字符与范例

RE字符 意义与范例
+

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

范例:查找(god)(good)(goood)等的字符串

egrep -n 'go+d' filename

?

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

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

egrep -n 'go?d' filename

|

意义:用‘或’的方式找出满足不同条件的字符串

范例:查找包含'gd'或'good'或'dog'的字符串

egrep -n 'gd|good|dog' filename

()

意义:找出‘组’字符串

范例:查找包含(glad)或(good)的字符串

egrep -n 'g(la|oo)d' filename

()+

意义:多个重复组的判别

范例:查找'A'开头'C'结尾,并且'A'和'C'之间包含一个以上的'xyz'的字符串

egrep -n 'A(xyz)+C' filename

二、使用正则表达式的工具

  1、sed工具

    sed是一种以行为单位,对数据进行替换、删除、新增、选取特定行等操作的工具,同时也支持管道

 用法:sed [-nefr] [动作]
参数说明:
-n  :使用安静模式,加上-n使得只有经过sed处理的那一行才会被显示出来
-e   :直接在命令行模式上进行sed的动作编辑
-f  :直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作
-r   :sed的动作支持的是扩展正则表达式的语法(默认为基础正则表达式语法)
-i   :直接修改读取的文件的内容,而不是由屏幕输出
动作说明:   [n1[,n2]] function
n1, n2 :一般代表选择进行动作的行数,不一定存在
funciton有下面这些参数:
a   :新增,a后面可接字符串,这些字符串会在新的一行出现(当前行的下一行)
c   :替换,c后面可接字符串,这些字符串可以替换n1, n2之间的行
d   :删除,后面通常不接参数
i   :插入,后接字符串,这些字符串将会出现在新的一行(当前行的上一行)
p   :打印,将某个选择的数据打印出来,通常 p 会与 sed -n 一起运行
s   :替换,可以直接进行替换,通常配合正则表达式使用

    范例:

 ①以行为单位的新增/删除:
$ sed '2,5d' filename   #删除第2~5行
$ sed '2a hello world' filename   #在第二行后面新增一行,内容为“hello world”
②以行为单位的替换与显示:
$ sed '2,5c No 2-5 number' filename   #将第2~5行替换为新的一行,内容为‘No - number’
$ sed -n '2,5p' filename   #打印第2~5行,如果不加-n则会把所有数据都输出一遍
③部分数据的查找并替换:sed 's/old/new/g' filename   #将'old'替换为'new'
$ sed 's/#.*$//g'   #删除注释
$ sed '/^$/d'     #删除空行
④直接修改文件内容:加上-i参数可以直接修改文件内容(利用这个功能可以在代码文件中将多行代码注释掉)

  推荐阅读sed简明教程

  2、awk工具

    awk是一种优良的文本处理工具,支持正则表达式和管道,经常用于将一行分成数个‘字段’来处理

 用法:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename   #字段分隔符默认为空格或[tab]键

    处理流程:

      ①读入第一行,并将第一行的数据填入$0,$1,...等变量当中;

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

      ③做完所有动作与条件类型;

      ④重复①~③,直到处理完所有数据;

 #字段的变量名称:$0表示整一行,$1代表第一个字段,以此类推
#内置变量:NF(每一行拥有的字段总数)、NR(当前处理的行是第几行)、FS(目前的分隔符)
#逻辑运算符:>、<、>=、<=、==、!=
#关键字:BEGIN、END
#语法:  BEGIN{这里面放的是执行前的语句}
#     END{这里面放的是处理完所有行后要执行的语句}
#     {这里面放的是处理每一行要执行的语句}

  范例:

  假设有一个文件名为pay.txt,内容如下:

 #    Name   1st   2nd   3th
# VBird  
# DMTsai
# Bird2  

  如果我要计算每一个人的总额,并且按照一定的格式打印出来,那么可以这样:

 $ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "Total" }
> NR>={total = $ + $ + $
> printf "%10s %10d %10d %10d %10.2f\n", $, $, $, $, total}'

  其中的printf的用法和C语言中的差不多,输出的结果类似这样:

 #      Name     1st     2nd     3th     Total
#      VBird             72000.00
#      DMTsai             64000.00
#      Bird2             126000.00

  推荐阅读AWK 简明教程

三、其他工具

  1、文件比较工具: diff、cmp、patch

 # diff:通常用于同一文件的新旧版本区别上,以行为单位比较
#用法:diff [-bBi] from-file tofile   #比较from-file和to-file并输出不同的地方
# cmp:以‘字节’为单位比较
#用法:cmp [-s] file1 file2   #按字节比较file1和file2,并输出发现的第一个不同点,加上-s输出所有不同点
# patch:与 diff 配合制作补丁文件和升级文件
#用法:
$ diff -Naur oldfile newfile > patch_file   #通过比较新旧文件制作补丁文件,patch_file通常以.patch为后缀
$ patch -pN < patch_file    #更新旧文件,N表示取消几层目录
$ patch -R -pN < patch_file #还原为原来的文件

  2、文件打印准备: pr

 # pr:为要打印的文件设置标题和页码
#用法:pr filename   #为filename的输出加上文件时间、文件名称和页码

总结:正则表达式真的是一种非常有用的工具,由简单的规则可以搭配出复杂的字符串,不过伴随着高效率的往往是高难度,需要以后不断的使用才能逐渐掌握

bash shell学习-正则表达式基础 (笔记)的更多相关文章

  1. 学习webpack基础笔记01

    学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...

  2. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  3. bash shell学习笔记(一)—— 常用命令

    一.基本的bash shell命令 1.默认bash shell 提示符是美元符号($); 2.bash手册 使用man命令来访问存储在Linux系统上的手册页面,如: bogon:~ Mac$ ma ...

  4. Linux下Bash shell学习笔记

    原文地址: http://www.cnblogs.com/NickQ/p/8870423.html 1.shell下没有变量类型和定义的概念. 变量直接使用不用定义 所有值都视为字符串. 在对变量取值 ...

  5. bash shell学习-实践 (自己实现一些小工具)

    The poor starve while the rich feast. "穷人饥肠辘辘,富人大吃大喝" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)  Linux S ...

  6. shell学习指南-阅读笔记

    shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...

  7. 【Linux】bash shell学习

    Bash Shell Linux系统的合法shell都写入/etc/shells这个文件,默认使用的shell版本称为“Bourne Again Shell(简称bash)” 用户登录时系统会分配一个 ...

  8. 配置和启动脚本(bash shell学习01)

    bash是 Bourne Again Shell简称 ,从unix系统的sh发展而来 查看当前shellecho $SHELL查看系统支持的shellcat /etc/shells cd /binls ...

  9. bash shell学习-shell script基础 (笔记)

    A chain no stronger than its weakest link. "一着不慎,满盘皆输" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)  Linux ...

随机推荐

  1. Data 语义学(2)

    四."继承"与 Data Member (1). 只有继承没有多态 先来看个例子 #include <iostream> using namespace std; cl ...

  2. P1894セチの祈り

    描述 在 Ninian 的花园里,有许多琼花,环绕着中间的凉亭.有 N 片琼花,组成一个环.Ninian 想在凉亭中发动 [セチの祈り] , 需要划分出三个区域的琼花,为了平均,要最大化面积最小的区域 ...

  3. Xcode7真机调试iOS应用程序

    金田 近日苹果发布的新的Xcode7带来了许多特性,比如:swift语言比以前运行更快.功能更强.代码具有更高的可读性.Xcode的测试功能可以帮助用户记录应用程序的行为等,还有我们今天要讲到的Xco ...

  4. 2015第37周二foxmail邮箱客户端迁移

    foxmail7.0邮箱客户端迁移风波浪费我下午不少时间,不知为何做完foxmail客户端在卡的时候我将其强制关闭,然后将整个邮箱目录拷贝到一台新电脑上,运行客户端居然我要新建账户(账户信息丢失),将 ...

  5. PL/SQL Developer 与tnsnames.ora

    PL/SQL Developer 是一款流行的oracle开发与管理的IDE. 在登录PL/SQL Developer时所选择的数据库依赖于tnsnames.ora文件中的信息. 如果我们安装了多个o ...

  6. [转载]Web前端和后端之区分,以及面临的挑战

    原文地址:Web前端和后端之区分,以及面临的挑战[转]作者:joyostyle 在我们实际的开发过程中,我们当前这样定位前端.后端开发人员. 1)前端开发人员:精通JS,能熟练应用JQuery,懂CS ...

  7. 雅虎NCP:网络黄页的终结者

    雅虎NCP是什么,NCP能做什么,为什么NCP能够成为网络黄页的终结者.NCP在颠覆既有市场格局的同时,其真实目的时什么?是成为网络化操作系统还是图谋最大化长尾广告.笔者相信,过不了多久,市场将会告诉 ...

  8. Linux开发工具之gdb(下)

    三.gdb调试(下) 01.查看运行时数据 print - 查看变量值 ptype - 查看类型 print array - 查看数组 print *array@len - 查看动态内存 print ...

  9. Codeforces 190E - Counter Attack

    [题意]给一个无向图的反图(即给定的边实际上不存在,而未给的边是存在的),求连通块数.(点数n<=5*10^5,边数m<=10^6) 一开始我想的用DFS,枚举每一个点,跳过不存在的点,直 ...

  10. Apache MINA 框架之Handler介绍

    IoHandler 具备以下几个功能: sessionCreated sessionOpened sessionClosed sessionIdle exceptionCaught messageRe ...