今天是巩固sed编辑器的一天

概述

  • sed是一种流编辑器, 流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流,像流水一样的从上往下一行行处理
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行输入,要么储存在一个命令文本文件中
  • sed除了模式空间外还有保持空间

工作流程

  • 读取
    • sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间pattern space)
  • 执行
    • 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
  • 显示
    • 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
  • 在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
  • 默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出,所以当使用sed-i的时候最好先进行备份

命令格式

sed -e ‘操作’ 文件1 文件2 …
sed -n -e ‘操作’ 文件1 文件2 …
sed -f 脚本文件 文件1 文件2 …
sed -i -e ‘操作’ 文件1 文件2 …
sed -e ‘n{
操作1
操作2

}’ 文件1 文件2 …

常用选项

选项 说明
-e
- -expression
表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略,一般在执行多个操作命令时使用
-f
- -file=
表示用指定的脚本文件来处理输入的文本文件
-h
- -help
显示帮助
-n
- -quiet
- -silent
禁止sed编辑器输出,但可以与p命令一起使用从而完成输出
-i 直接修改目标文本文件
[root@localhost ~]# sed -n 'p' 9.txt
【禁止sed编辑器输出,只通过p操作打印9.txt里的内容】
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

常用操作

操作 说明
s 替换
替换指定字符
d 删除
删除选定的行
a 增加
在当前行下面增加一行指定内容
i 插入
在选定行上面插入一行指定内容
c 替换
将选定行替换为指定内容
y 字符转换
转后前后的字符长度必须相同
p 打印(显示)
如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容
如果有非打印字符,则以ASCII码输入。
通常与“-n”选项一起使用
= 打印行号
小写L(l) 打印数据流中的文本和不可打印的ASCII字符
例如:结束符“$”、制表符“\t”等

基本命令格式注释

[root@localhost ~]# sed -n -e '=;p;l'  9.txt
【禁止sed编辑器输出,只通过=、p、l操作输出行号与不可打印的ASCII字符的打印】
1
one
one$
2
two
two$
......
......
......
12
twelve
twelve$
[root@localhost ~]# sed -n '
> =
> p
> l
> ' 9
1
one
one$
2
two
two$
......
......
......
12
twelve
twelve$

使用地址进行寻址出具体行操作命令+注释

  • sed编辑器有2种寻址方式
    • 1.以数字形式表示行区间
    • 2.用文本模式把行过滤出来
[root@localhost ~]# sed -n '1p' 9              【打印第1行内容】
one
[root@localhost ~]# sed -n '$p' 9              【打印最后一行内容】
twelve  
[root@localhost ~]# sed -n '1,3p' 9            【打印13行内容】
one
two
three
[root@localhost ~]# sed -n '3,$p' 9            【打印第3行到最后一行内容】
three
four
five
six
seven
eight
nine
ten
eleven
twelve
[root@localhost ~]# sed -n '1,+3p' 9           【打印第一行之后的连续3行,即1-4行】
one
two
three
four
[root@localhost ~]# sed '5q' 9                 【打印前5行信息后退出,q表示退出】
one
two
three
four
five
[root@localhost ~]# sed -n 'p;n' 9             【打印奇数和,n表示移动到下一行】
one
three
five
seven
nine
eleven
[root@localhost ~]# sed -n 'n;p' 9             【打印偶数行,先n移动到下一行】
two
four
six
eight
ten
twelve
[root@localhost ~]# sed -n '2,${n;p}' 9        【打印从第2行开始往下的奇数行,因为后面为n所以直接输出第三行】
three
five
seven
nine
eleven
[root@localhost ~]# sed -n '/user/p' /etc/passwd
【打印包含/user/这个字符的行】
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
[root@localhost ~]# sed -n '/^a/p' /etc/passwd
【打印以a为开头的所有行】
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
[root@localhost ~]# sed -n '/bash$/p' /etc/passwd
【打印以/bash/为结束的所有行】
root:x:0:0:root:/root:/bin/bash
qz:x:1000:1000:qz:/home/qz:/bin/bash
[root@localhost ~]# sed -n '/ftp\|root/p' /etc/passwd
【打印包含/ftp/或者/root/字符的所有行,“|”前面需加转义符“\”,不加\只会搜索包含ftp|root的字符】
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# sed -n '2,/nobody/p' /etc/passwd
【打印从第2行开始打印,一直打印到第一个含有/nobody/字符的行】
bin:x:1:1:bin:/bin:/sbin/nologin
......
......
......
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# sed -n '2,/nobody/=' /etc/passwd
【将第2行开始,一直到第一个含有/nobody/字符的行号打印出来】
2
3
......
......
......
12
13
[root@localhost ~]# sed -nr '/ro{1,}t/p' /etc/passwd
【-r表示支持正则表达式。用正则表达式过滤出字符串至少包含一次或以上“o”的存在于ro与t之间并打印出来】
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

删除行操作命令+注释

[root@localhost ~]# cat 9.txt
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
[root@localhost ~]# sed -i 'd' 9.txt             【删除全部行,并执行直接修改操作】
[root@localhost ~]# cat 9.txt
[root@localhost ~]# sed '3d' 9                   【删除第三行】
one
two
......
......
twelve
[root@localhost ~]# sed '2,4d' 9                 【删除第2到第4行】
one
five
......
......
twelve
[root@localhost ~]# sed '$d' 9                   【删除最后一行】
one
......
......
ten
eleven
[root@localhost ~]# vim 9
[root@localhost ~]# cat 9
one
......
......
eleven
twelve


[root@localhost ~]# sed '/^$/d' 9                【删除空行,因为空格也是字符串的一种,所以需要加上“/”去进行匹配】
one
two
......
......
eleven
twelve
[root@localhost ~]# sed '/nologin$/d' /etc/passwd
【删除/etc/passwd文件中包含nologin字符串的所有行】
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
qz:x:1000:1000:qz:/home/qz:/bin/bash
[root@localhost ~]# sed '/nologin$/!d' /etc/passwd
【删除/etc/passwd文件中不包含nologin字符串的所有行,“!”表示取反操作】
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
......
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# sed '/2/,/3/d' 9-1
【从第一个位置“2”打开删除功能,到第二个位置“3”关闭删除功能】
4
114
33
[root@localhost ~]# cat 9-1
4
2
3
114
33
5512

[root@localhost ~]# sed '/1/,/3/d' 9-1
4
2
3
[root@localhost ~]# cat 9-1
4
2
3
114
33
5512


替换操作命令+注释

  • 行范围 s/旧字符串/新字符串/替换标记
  • 4种替换标记
    • 数字:标明新字符串将替换第几处匹配的地方
    • g:标明新字符串将会替换所有匹配的地方
    • p:打印与替换命令匹配的行,与-n一起使用
    • w 文件:将替换结的结果写到文件中
[root@localhost ~]# cat 9
one/six
two
three/ten
four
five/twe
six/six/two/ten
seven
eight
nine/ten/two
ten
eleven
twelve
[root@localhost ~]# sed -n 's/ten/q/p' 9        
【将旧字符"ten"替换成新字符"q",并将替换成功的行打印出来】
three/q
six/six/two/q
nine/q/two
q
[root@localhost ~]# sed -n 's/six/q/2p' 9
【将一行中第2处匹配到的旧字符"six"替换成新字符"q",并将替换成功的行打印出来】
six/q/two/ten
[root@localhost ~]# sed -n 's/six/q/gp' 9
【将所有匹配到"six"字符的行,全部将旧字符"six"替换成新字符"q"】
one/q
q/q/two/ten
[root@localhost ~]# sed '1,3 s/^/#/' 9
【将第1到第3行的"^"字符改成"#"字符】
#one/six
#two
#three/ten
four
......
twelve
[root@localhost ~]# sed '/^e/ s/$/#/' 9
【将所有以字符"e"开头的行最后的"$"字符替换成"#"字符】
one/six
......
eight#
nine/ten/two
ten
eleven#
twelve
[root@localhost ~]# sed -f jb.sed 9
【通过脚本携带多个命令去执行】
#one/six
#Two
#Three/ten
#four
five/Twe
six/six/Two/ten*
seven*
eighT
nine/Ten/two
Ten
eleven
Twelve
[root@localhost ~]# cat jb.sed 
s/t/T/

/^s/ s/$ \/*/
【这里的“\”是为了csdn格式美观,不属于命令】

1,4 s/^/#/
【所有旧字符"t"全部替换成新字符"T"
 所有字符“s”开头的行都将最后的“$”换成“*14行所有的“^”全替换成"#"[root@localhost ~]# sed '1,5w 9-2.txt' 9
【将文件9里的15行替换并保存到文件9-2.txt中】
[root@localhost ~]# sed '1,5 s/^/#/ w 9-2.txt' 9
【将文件9里的15行的字符"^"替换成字符"#",并将替换后的结果保存到文件9-2.txt中】
[root@localhost ~]# cat 9-2.txt 
#one/six
#two
#three/ten
#four
#five/twe
[root@localhost ~]# sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd
【将文件/etc/passwd里的旧字符"/bin/bash/"换成新字符"/bin/csh/"】
root:x:0:0:root:/root:/bin/csh
qz:x:1000:1000:qz:/home/qz:/bin/csh
[root@localhost ~]# sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd
【当需要进行替换目录操作时,为了防止符号的混乱,可以使用"#"或者"!"代替"\"作为字符串分隔符】
root:x:0:0:root:/root:/bin/csh
qz:x:1000:1000:qz:/home/qz:/bin/csh

剩余其他操作命令+注释

[root@localhost ~]# cat 9-1
4
2
3
114
33
5512
[root@localhost ~]# sed '/2/c ABC' 9-1
【将包含字符"2"的行全部替换成字符"ABC"4
ABC
3
114
33
ABC
[root@localhost ~]# sed '/2/ y/2/AB/' 9-1
sed:-e 表达式 #1,字符 11:“y”命令的字符串长度不同
[root@localhost ~]# sed '/2/ y/2/A/' 9-1
【先查询字符"2",并将字符"2"转换成字符"A",转换前后的字符长度必须相同】
4
A
3
114
33
551A
[root@localhost ~]# sed '4,6a AAA' 9-1                【在4-6行的下面一行增加指定字符"AAA"4
2
3
114
AAA
33
AAA
5512
AAA
[root@localhost ~]# sed '1,2i ABC' 9-1                 【在1-2行的上面一行增加指定字符"AAA"】
ABC
4
ABC
2
3
114
33
5512
[root@localhost ~]# sed '$r /etc/resolv.conf' 9-1      【在最后一行下面读入指定内容 】
4
2
3
114
33
5512
# Generated by NetworkManager
nameserver 192.168.131.2
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.131.2
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
......
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
......
qz:x:1000:1000:qz:/home/qz:/bin/bash
[root@localhost ~]# sed '/root/{H;d};$G' /etc/passwd
【将/etc/passwd里包含/root/字符串的行复制到剪切板,并删除,然后粘贴到最后一行。H:复制到剪切板;d:删除;G:粘贴到指定的行后】
bin:x:1:1:bin:/bin:/sbin/nologin
......
......
qz:x:1000:1000:qz:/home/qz:/bin/bash

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed '1,2H;3,4G' 9-1 
【将1-2行的内容分别复制到第3行和第4行下面】
4
2
3

4
2
114

4
2
33
5512

猜你喜欢

转载自blog.csdn.net/TaKe___Easy/article/details/114825562