正则表达式:【一组特殊的符号】用符号的方式来表达想要表达的
正则表达式在计算机中属于通用语言,类似英语属于国际语言
基本正则表达式
^ 开始
$ 结尾
[ ] 集合,取任意单个符号【也就是分别去识别】比如 grep “[acde]”.txt
查找有 a c d e .txt 开头的文件,任意一个都行
[a-e6-9xz] =[abcde6789xz]
例如:在 a.txt 中寻找两行含有 tast,test 的两行 grep “t[ae]st”
[^] 对集合取反
. 任意单个字符
匹配前一个字符出现了任意次
grep “ae” /etcpasswd
只匹配号之前的字符,在有一个 a 的情况下就符合条件,不管 a 后面有几个 e,
或者没有 e 字符也符合
. 匹配任意所有
{n,m} 匹配前一个字符出现了 n 到 m 次
{n}
匹配前一个字符出现 n 次{n,} 匹配前一个字符出现 n 次以及 n 次以上
() 保留,复制的意思;例如我要复制 abc
(abc),在某些字符连续出现的时候,使用比较方面
粘贴式为 \1
grep 支持正则表达式,寻找东西,可以使用 grep 和正则
grep -i 不区分大小写
若在 grep 检索式同时组合多个条件,比如输出以“root”或者以“daemon”开头的
行(“或者”必须转义为“|”):
[root@ Shell ~]# grep '^root|^daemon|^stu' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
stu:x:1036:1036::/home/stu:/bin/bash
\ 取消特殊字符含义,但是只能取消单个特殊字符意思,要取消的特殊字符放在\的右
边:例如
[root@room8pc01 桌面]# a=1
[root@room8pc01 桌面]# b=2
[root@room8pc01 桌面]# echo $a$b
12
[root@room8pc01 桌面]# echo "\$a$b"
$a2
[root@room8pc01 桌面]# echo "\$a\$b"
$a$b
扩展正则
【优化,增加新的表达式】
{n,m} 匹配前面的字符出现 n 到 m 次
? 匹配前面的字符出现了 0 到 1 次 【表示可有可无】

  • 匹配前面的字符出现了>=1
    (|) 或者
    \b 边界,意思就是当我在一个字符左边放入\b,那么字符的左边不允许有任何
    【至少出现一次】
    例如:(test | teaste)
    字符,同样右边也是如此
    ()
    组合整体,保留;复制的意思在某些字符连续出现的时候,使用比较方面
    粘贴式为 \1,在一个命令中,出现多次保留时,粘贴第一个为\1,粘贴第二
    个为\2,例如:sed -r 's/^(.)(.)(.)$/\3\2\1/' te.txt
    基本正则:兼容性强,但是复杂
    扩展正则:兼容性差,简单
    当 grep 不支持扩展正则时,试用 egrep 或者加入 grep -E
    [root@room8pc01 桌面]# egrep
    "(test|taste)"
    regularexpress.txt
    I can't finish the test.
    Oh! The soup taste good.
    [root@room8pc01 桌面]# grep
    "(test|taste)"
    regularexpress.txt
    无输出
    SED 基本用法
    sed 文本编辑器【非交互式编辑器,适用于脚本】
    sed 逐行处理,每次只读取一行的文件
    Sed ‘条件指令【快捷建】’
    sed 【选项】‘条件 指令’选项为:-n -i -r
    -n
    【屏蔽默认的输出】加入 n 只出来第 3 行,如果不加入-n 然后会整个文件全部
    显示,然后第三行出现 2 次,因为默认 sed 会逐行输出,第一次属于默认输出,
    第二次属于执命令
    -r 加入-r 支持扩展正则
    -i 加入-i 直接修改源文件
    Sed 默认将修改的文件临时放在内存条里面,然后在屏幕输出,不会直接修改
    源文件
    Sed -n ‘3p’ /etc/passwd [ p : 输出,查看
    Sed -n ‘p’ /etc/passwd
    d:删除
    ]
    【将全部内容显示】
    条件:
    1. 行号
    2. /正则/
      【正则放在//里面】
      无条件:【代表所有条件】
      指令
      增:
      查:p print
      2,4p 输出 2,3,4 行
      Sed -n “1~2p”test.txt
      2p;4p 输出 2 行和 4 行
      必须加入-n
      输出奇数行
      1~2p 【从第一行开始,隔多少行输出一次,然后自加 2】
      Sed -n “2~2p”test.txt
      输出偶数数行
      2~2p 【从第二行开始,隔多少行输出一次,然后自加 2】
      删:d
      delite 2,4d 删除 2,3,4 行 不能加入 -n
      改:s/old/new/ 【将每行的第一个 old 修改为 new】替换关键词,替换关键符可以
      换成其他字符。例如:s#old#news/old/new/3
      s/old/new/g
      【将每行的第三个 old 修改为 new】
      【将所有的 old 修改为 new】
      [root@ Shell ~]# cat test.txt
      2001 2002 2003 2001
      2005 2060 2001 2004 2001
      2001 2001 5002 2004 2001
      2001 3005 5301 5010 2001
      [root@ Shell ~]# sed
      's/2001//' test.txt
      2002 2003 2001
      2005 2060 2004 2001
      2001 5002 2004 2001
      3005 530[root@ Shell ~]# sed '3s/2001//g' test.txt
      2001 2002 2003 2001
      2005 2060 2001 2004 2001
      5002 2004
      2001 3005 5301 5010 2001
      [root@ Shell ~]# sed -n '2p;8p' /etc/passwd
      bin:x:1:1:bin:/bin:/sbin/nologin
      halt:x:7:0:halt:/sbin:/sbin/halt
      例如:
      vim test.txt
      Yue ma
      Chi le ma
      【查看第二行与第八行】He le ma
      条件:
      1.将第一字符和最后一个字符对调,
      sed -r 's/^(.)(.)(.)$/\3\2\1/' te.txt
      2.将第二字符和倒数第二个字符对调
      sed -r 's/^(.)(.)(.)(.)(.)$/\1\4\3\2\5/' te.txt【使用任意字符来实现】
      Sed 的文本块处理动作
      [root@ Shell ~]# cat tes.txt
      NI SHI SHUI ,NI SHI SHUI
      WO SHI SHUI ,WO SHI SHUI
      NI REN SHI ,WO BU REN SHI
      i

insert
插入
【在某行的上面插入一行】
[root@ Shell ~]# sed '3i xx' tes.txt
NI SHI SHUI ,NI SHI SHUI
WO SHI SHUI ,WO SHI SHUI
xx
NI REN SHI ,WO BU REN SHI
a

append
追加
【在某行的下面追加一行】
[root@ Shell ~]# sed '3a xx' tes.txt
NI SHI SHUI ,NI SHI SHUI
WO SHI SHUI ,WO SHI SHUI
NI REN SHI ,WO BU REN SHI
xxc
替换行
【替换正行内容】
[root@ Shell ~]#
sed
'3c xx'
tes.txt
NI SHI SHUI ,NI SHI SHUI
WO SHI SHUI ,WO SHI SHUI
xx
r
导入 sed '3【在哪一行导入】r c.txt【需要导入的文件】' d.txt【导入到哪个文件】
如果想要在最后以行导入则是 sed
'/$/r
c.txt '
d.txt
[root@room8pc01 桌面]# cat d.txt
3543246
31353
1.213
35131.1d.txt
[root@room8pc01 桌面]# sed '3r c.txt'
d.txt 【在第 3 行导入 c.txt 文件】
3543246
31353
1.213
asodfjja
asdfna
asldfjandf
jsadfn,as
35131.1
w
另存为 sed '2w【将哪一行另存为】 f.txt【令存为的文件】' d.txt【从某文件导出
的】 不需要加入-i 可以直接生成令存文件
[root@room8pc01 桌面]# cat d.txt3543246
31353
1.213
35131.1
[root@room8pc01 桌面]# sed '2w f.txt' d.txt
3543246
31353
1.213
35131.1
[root@room8pc01 桌面]# cat f.txt
31353
模式空间与保留空间【可以理解为内存条中分为了两个空间】【保留空间中默认有个
回车(enter)】
H: 将模式空间中的内容追加到保留空间,大 H 是追加到保留空间,小 h 是覆盖式的
追加到保留空间【会覆盖回车】
G: 将留空间的内容追加到模式空间,大 G 将保留空间的内容追加到模式空间,不会
影响源内容,如果是小 g 则是覆盖式的加入保留空间,会影响即将输出的那一行
的文件
[root@ Shell ~]# cat test.txt
12345
54321
6789
9876[root@ Shell ~]# sed '2H;4G' test.txt
12345
54321
6789
9876
54321
[root@ Shell ~]# sed '2h;4g' test.txt
12345
54321
6789
54321
[root@ Shell ~]# sed '2h;4G' test.txt
12345
54321
6789
9876
54321
[root@ Shell ~]# sed '2H;4g' test.txt
12345
54321
6789
54321总结:
在使用 sed 时,只要不加入-i ,不管加入什么条件与参数,最后的结果只会在屏幕上
显示出来,不会修改源文件!!
输出文本
Sed -n ‘p’a.txt
Sed -n ‘4p’a.txt
输出所有行,等同于 cat a.txt
输出第 4 行
Sed -n ‘4,7p’a.txt
输出第 4 行到第 7 行
Sed -n ‘4p;7p’a.txt
输出第 4 行和第 7 行
Sed -n ‘4,+10p’a.txt 输出第 4 行以及其后面的 10 行内容
Sed -n ‘/^bin/p’a.txt 输出以 bin 开头的行
Sed -n ‘p;n’a.txt 输出奇数行,n 表示读入下一行文本
Sed -n ‘n;p’a.txt 输出奇数行,n 表示读入下一行文本
Sed -n
‘$=’ a.txt
输出文件的行数
删除文本
Sed ‘3,5d’ a.txt 删除 3 到 5 行
Sed ‘/xml/d’a.txt 删除所有包含 xml 的行
Sed ‘/xml/!d’a.txt Sed ‘/^install/d’a.txt
Sed ‘$d’a.txt Sed ‘/^$/d’a.txt
删除不包含 xml 的行,!符号表示取反
删除以 install 开头的行
删除文件的最后一行
删除所有空行
替换文本
Sed ‘s/xml/XML/’a.txt
将每行中的第 1 个 xml 替换为 XML
Sed ‘s/xml/XML/3’a.txt 将每行中的第 3 个 xml 替换为 XML
Sed ‘s/xml/XML/g’a.txt 将所有的 xml 替换为 XMLSed ‘s/xml//g’a.txt
将所有的 xml 都删除【替换为空串】
Sed ‘s/doc/&s/g’a.txt
将所有的 doc 替换为 docs,&代表前一个字符等同于
‘s/(doc)/\1s/’
Sed ‘4,7s/^/#/’a.txt
将第 4 至 7 行首加入#【注释掉】
Sed ‘s/^#an/an/’a.txt
解除以#an 开头的注释*