Linux基础正则表达式:grep,sed

时间:2023-03-10 03:00:13
Linux基础正则表达式:grep,sed

先说明语系对正则表达式的影响
    LANG=C:0,1,2,3,4...A,B,C,D...Z a b c d ... z
    LANG=zh_CN:0,1,2,3,4...a A b B c C d D... z Z
因为不同语系用[a-z]筛选的不同,所以出现了特殊符号
[:alnum:]  :  即0-9,a-z,A-Z,英文大小写字符和数字,
[:alpha:]   :  即a-z,A-Z,任何英文大小写字符
[:digit:]      :  即0-9,所有数字
[:upper:]   :  即A-Z,所有大写字符
[:lower:]     :   即a-z,,所有小写字符
[:space:]   :  任何会产生空白的字符,包括空格,Tab和CR等
[:blank:]    :  空格和tab
[:cntrl:]     : 键盘上的控制按键,包括C,LF,Tab,Del等
其他参考网上相关资料
现在看不到没关系,下面有例子

grep的一些高级参数

再11.5中已经讨论到了grep的基本用法
grep:分析一行信息
grep '查找的字符串' filename
找到的话就列出字符串存在的行
grep -i 忽略大小写
grep -n 顺便输出行号
grep -c 只计算找到的次数,不显示行
grep -v '' filename 显示没有的行
grep --color=auto '' filename   关键字有特殊颜色

grep -An1 -Bn2 ‘字符串’ filename
-A:after,显示出后续几行
-B:before,显示多前几行
-C:上下个几行
只要有找到的,都会在其下面或上面都n行
Linux基础正则表达式:grep,sed如果选出的没有颜色
可以自定义个人环境变量
在~/.bashrc中添加 alias grep='grep --color=auto'  再sourc ~/.bashrc

示例文本内容
regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motocycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!   My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no.1.
The world <Happy> is the same as "glad".
I like dog.
google is the best tools for search keyword.
gooooole yes!
go! go! Let's go.
#I am Vbird

grep所有用法示例:(每个例子都会列出-n显示行数)
a.(反向,不论大小写)查找特定字符串
    grep -n[v][i] '字符串' 文件
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed如果查找的有特殊字符(.*\{}‘),需要转义,下面(c)介绍
小数点,星号,反斜杠,大括号,单引号,不包括小括号(小括号是可以直接找到的)

b.利用中括号[]查找集合字符(就是可能出现的都写在中括号中,加^变成不存在的)
Linux基础正则表达式:grep,sed查找不是以g开头的后面接'oo'的字符串
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed剔除小写字符
Linux基础正则表达式:grep,sed我们知道因为语系不同可能会有影响可以使用特殊符号选取
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

c.任意一个字符. 与重复字符*
    .(小数点): 代表一定有一个任意字符
    *(星号):代表重复(RE,repeat)前一个0到无穷多次的意思,为组合形态
    这里的*与通配符的*是不一样的,通配符中的*是0个或多个字符的意思
g,d中间有两个字符
Linux基础正则表达式:grep,sed查找两个o以上的
Linux基础正则表达式:grep,sed两个g之间至少有一个o
Linux基础正则表达式:grep,sed.*代表0个或多个字符
Linux基础正则表达式:grep,sed找出所有数字
Linux基础正则表达式:grep,sed说明的是星号前面不一定是固定的东西,可能是正则表达式

d.使用行首字符^和行尾字符$
    ^与前面的反向选是不一样的
    反向选择字符是在中括号[]里面的,
    所有只要看到^在[]中,那么它就是反选,否则就是行首字符
Linux基础正则表达式:grep,sed找出以字符开头的    
Linux基础正则表达式:grep,sed不想要字母开头的
Linux基础正则表达式:grep,sed或者
Linux基础正则表达式:grep,sed

找出以.结尾的字符
因为是特殊字符,需要用\转义
Linux基础正则表达式:grep,sed注意:windows中的断行字符判断是不一样的,所以可能会出现找不到的问题
具体解决方法以后有时间会更新或者百度上有讲解

找出(去除)空白行
    ^$
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

去除一个文件中的空白行和注释
grep -v '^$' 'filename' | grep -v '^#'
可自己分析
Linux基础正则表达式:grep,sed原本共有48行,除去后
Linux基础正则表达式:grep,sed

e.限定连续RE(重复)字符范围{n1,n2} (n1,n2出现一个也可以)
    同样因为{}是转义字符,需要用\失去特殊意义
找出o出现两次的
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

其他特殊字符查询
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

sed工具
本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换,删除,新增,选取特定行等功能
sed [-nefr] [’动作‘]
参数:
    -n:安静模式,只有经过sed特殊处理的那一行(或者操作)才会被列出来    
            默认stdin和修改后的信息都会打印出来,
    -e:直接在命令行模式进行sed的动作编辑
    -f:直接将sed动作写在一个文件中,-f filename可以执行filename内的sed动作
    -r:sed动作支持的是扩展型正则表达式(默认是基础正则表达式语法)
    -i:直接修改读取的文件内容,而不是由屏幕输出  (默认是读取修改后输出到屏幕,原文件不会改变)
动作=[n1[,n2]]function
function:
    a:新增,后接字符串,会在指定行的下一行插入一行
    c:替换,后接字符串,替换n1,n2之间的行
    d:删除,不加字符串
    i:插入,后接字符串,再指定行的上一行插入一行        
    p:打印,将某个选择的数据打印出来,通常与sed -n一起运行
    s:替换,可以直接进行替换工作。通常搭配正则表达式

以行(hang)为单位的新增(sed '-2a str')和删除(sed 'n1,n2d')功能:
                    sed '2,5d'             
                    sed '2a Hello World'  
                    sed '2a Hello Word \[Enter] Yes'
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

以行为单位的替换(sed 'n1,n2c str')与显示(sed -n 'n1,n2p')功能
    显示就像head tail组合功能
                sed '2,5c No 2-5 number'
                sed -n '2,5p'
Linux基础正则表达式:grep,sedLinux基础正则表达式:grep,sed

部分数据的查找和替换功能(send 's/要被替换的字符串/新的字符串/g'     删除sed '/字符串/d')
    要被替换的字符串可以是正则表达式
    sed 's/#.*$//g' 将注释行替换为空白行
Linux基础正则表达式:grep,sed

直接修改文件内容(有时可用,但重要文件记得备份)
sed -i  's/../../g' filename