【Shell】文本三剑客-sed

目录

一、sed的相关知识及其工作流程

1.sed编辑器的介绍

2.sed 流编辑器的工作过程

二、sed命令格式与常用选项

1.命令格式

2.常用选项:

3.常用操作

三、sed打印功能

1.打印内容

2.使用地址

四、sed删除操作

1.格式

2.案例

五、sed替换功能

1.格式

2.四种替换标记

六、sed插入功能


一、sed的相关知识及其工作流程

1.sed编辑器的介绍

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

2.sed 流编辑器的工作过程

sed的工作流程主要包括读取、执行和显示三个过程

读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )
执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中 

二、sed命令格式与常用选项

1.命令格式

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 ...

2.常用选项:

选项含义
-e或--expression=表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f或--file=表示用指定的脚本文件来处理输入的文本文伙
-h或--help显示帮助
-n、-quiet 或silent 禁止sed编辑器输出,但可以写p命令一起使用完成输出
-i  直接修改目标文本文件

3.常用操作

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

 注意:s 和 y都是替换,s是替换指定字符,y是字符转换,转换前后的字符长度必须相同

s/hello/helloworld        #替换指定字符

y/hello/abcde               #字符转换,转换前后的字符长度必须相同

三、sed打印功能

1.打印内容

sed -n -e 'p' testfile1

sed -n -e '=' testfile1

sed -n -e 'l' testfile1

sed -n -e '=;p' testfile1
sed -n -e '=' -e 'p' testfile1

sed -n '
> =
> p
> ' testfile1

[root@localhost ~]# cat 1.txt
1
2
3

4


5



6

7
8
[root@localhost ~]# sed -n -e '1p' 1.txt    #打印第一行
1
[root@localhost ~]# sed -n -e '$p' 1.txt    #$表示最后一行的效果
8
[root@localhost ~]# sed -n -e '4,$p' 1.txt        #打印第4行到最后一行

4


5



6

7
8
[root@localhost ~]#
[root@localhost ~]# sed -n -e '4,+3p' 1.txt        #第四行和后面3行

4


[root@localhost ~]#

2.使用地址

sed编辑器有2种寻址方式:

1)以数字形式表示行区间
2)用文本模式来过滤出行

sed -n '1p' testfile1                                   #打印第1行

sed -n '$p' testfile1                                   #打印最后一行

sed -n '1,3p' testfile1                                #打印1~3行

sed -n '3,$p' testfile1                                #打印第3行到最后一行

sed -n '1,+3p' testfile1                              #打印1之后的连续3行,即1-4行

sed '5q' testfile1                                       #打印前5行信息后退出,q表示退出

sed -n 'p;n' testfile1                            #打印奇数行;n表示读取下一行,覆盖模式空间前一行

sed -n 'n;p' testfile1                            #打印偶数行

sed -n '2,${n;p}' testfile1                     #从第2行开始,打印偶数行

sed -n '1~2p' testfile1                         #跨2行读取

sed -n '1~3p' testfile1                         #跨3行读取

sed -n '/user/p' /etc/passwd                #打印包含user的行

sed -n '/^a/p' /etc/passwd                    #打印以a开头的行

sed -n '/bash$/p' /etc/passwd              #打印以bash结尾的行

sed -n '2,/nobody/p' /etc/passwd

sed -n '2,/nobody/=' /etc/passwd

sed -nr '/ro{1,}t/p' /etc/passwd             #-r表示支持扩展正则表达式

#打印奇数行和偶数和

#查看奇偶数行
[root@localhost ~]# cat 1.txt
1
2
3
4
5
6
7
8
[root@localhost ~]# n=0        #使用循环查看奇数行
[root@localhost ~]# for i in $(cat 1.txt)      
> do
> let n++
> if [ $[n%2] -eq 1 ];then
> echo $i
> fi
> done
1
3
5
7

[root@localhost ~]# sed -n 'p;n' 1.txt    #使用sed查看奇数行
1
3
5
7
[root@localhost ~]#

#查看偶数行
[root@localhost ~]# sed -n 'n;p' 1.txt
2
4
6
8
[root@localhost ~]#


#查看行内容

#从第2行开始读取,读取奇数行
[root@localhost ~]# sed -n -e '2,${n;p}' 1.txt
3
5
7
[root@localhost ~]#
#跨2行读取
[root@localhost ~]# sed -n -e '1~2p' 1.txt
1
3
5
7
[root@localhost ~]#
#查看包含2字符的行内容
[root@localhost ~]# sed -n -e '/2/p' 1.txt
2
[root@localhost ~]#

sed支持正则表达式

加上-r 选项支持扩展的正则表达式

四、sed删除操作

1.格式

sed -e '删操作' -e '查操作'  目标文件

sed -e '{
删操作
查操作
}' 目标文件

sed 'd' testfile1                                    #全删

sed '3d' testfile1                                  #删除第3行

sed '2,4d' testfile1                                #删除2~4行

sed '$d' testfile1                                   #删除最后一行

sed '/^$/d' testfile1                                #删除空行

sed '/nologin$/d' /etc/passwd                

sed '/nologin$/!d' /etc/passwd              #“!”表示取反操作

sed '/2/,/3/d' testfile2              #从第一个位置打开行删除功能,到第二个位置关闭行删除功能
sed '/1/,/3/d' testfile2

2.案例

删除行

[root@localhost ~]# sed '3d' 1.txt    #删除第3行
1
2
4
5
6
7
8
[root@localhost ~]# sed '3,5d' 1.txt    #删除第3行到第5行
1
2
6
7
8
[root@localhost ~]# sed '$d' 1.txt    #删除最后一行
1
2
3
4
5
6
7
[root@localhost ~]# sed '3,$d' 1.txt    #删除第3行到第5行
1
2
[root@localhost ~]#

#删除空行 

#删除空行
[root@localhost ~]# cat 2.txt
1111




2222
[root@localhost ~]# cat 2.txt | sed '/^$/d'
1111
2222
[root@localhost ~]#

#删除可登录用户和保留可登录用户

#删除可登录用户
[root@localhost ~]# cat /etc/passwd | sed '/\/bin\/bash$/d'

#保留可登录用户
[root@localhost ~]# cat /etc/passwd | sed '/\/bin\/bash$/!d'

#删除指定行 

#删除从第一个包含2的行到第一个包含3的行
[root@localhost ~]# cat 1.txt | sed -e '/2/,/3/d'
1
4
5
6
7
8

#从第一个包含1的行到第一个包含3的行 下一个包含1的行到下一个包含3的行
[root@localhost ~]# cat 1.txt | sed -e '/1/,/3/d'
4
5
6
7
8
[root@localhost ~]#

注意:不建议开头位置使用字符串,容易误删

五、sed替换功能

1.格式

行范围   s/旧字符   /新字符   /替换标记

注意: s(字符串替换)    c(整行内容替换)     y(对应字符替换)

2.四种替换标记

数字表明新字符串将替换第几处匹配的地方
g表明新字符串将会替换所有匹配的地方
p打印与替换命令匹配的行,与-n一起使用
w 文件将替换的结果写到文件中

#替换指定内容


[root@localhost ~]# sed -n -e '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#将root替换为admin
[root@localhost ~]# sed -n -e 's/root/admin/p' /etc/passwd
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将所有地方的root都替换为admin
[root@localhost ~]# sed -n -e 's/root/admin/gp' /etc/passwd
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
[root@localhost ~]#

#在指定行添加内容

#删除15-26行的#号
[root@localhost ~]# sed '15,26 s/^#//' /etc/yum.conf

#为1-12行添加#号
[root@localhost ~]# sed -i '1,12 s/^/#/' /etc/yum.conf

#只看修改过的行
[root@localhost ~]# sed -n '/swap/ s/^/#/p'/etc/fstab

 #分隔符

[root@localhost ~]# sed -e 's/\/bin\/bash/\/sbin\/nologin/g' /etc/passwd

[root@localhost ~]# sed -e 's#/bin/bash#/sbin/nologin#g' /etc/passwd

#字符串替换

#字符串替换
[root@localhost ~]# echo 112233 | sed -r 's/(11)(22)(33)/\3\2\1/'
332211
[root@localhost ~]# echo Iloveyou | sed -r 's/(I)(love)(you)/\3\2\1/'
youloveI
[root@localhost ~]#

 #整行替换

#整行替换: 行号+c 新的内容
[root@localhost ~]# cat 1.txt
1
32
56
66
65
76
85
asd
ADC
QWE
[root@localhost ~]# cat 1.txt | sed '5c 111'
1
32
56
66
111
76
85
asd
ADC
QWE
[root@localhost ~]#
#字符替换,要求新旧字符长度相同
[root@localhost ~]# cat 1.txt | sed 'y/32/111/'
sed:-e 表达式 #1,字符 9:“y”命令的字符串长度不同
[root@localhost ~]# cat 1.txt | sed 'y/32/11/'
1
11
56
66
65
76
85
asd
ADC
QWE
[root@localhost ~]#

六、sed插入功能

sed '/45/c ABC' testfile2                    #

sed 'y/145/ABC/' testfile2                  #使所有的1字符转换成A,所有的2字符转换成B,所有的3字符转换成C

sed '1,3a ABC' testfile2

sed '/root/{H;d};$G' /etc/passwd      #将包含root的行剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后

sed '1,2H;3,4G' /etc/passwd            #将1、2行复制到3和4行的下面

echo "111222333" | sed -r 's/(111)(222)/\2\1/'         #将字符 111 和 222 互换位置
echo "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'        #将第一个字符和最后一个字符互换

sed "$!N;s/\n/ /" testfile2                  #N表示追加下一行到模式空间,同时将两行看做一行,两行之间含有\n换行符。$!N表示最后一行不执行N

#插入内容

#再最后一行插入
[root@localhost ~]# cat 1.txt | sed '$a 111111'
1
32
56
66
65
76
85
asd
ADC
QWE
111111

#在区间插入,1-3行每行后面都插入
[root@localhost ~]# cat 1.txt | sed '1,3a 111111'
1
111111
32
111111
56
111111
66
65
76
85
asd
ADC
QWE
[root@localhost ~]#

#读入文件内容

#读入文件内容
[root@localhost ~]# sed -e '$r 2.txt' 1.txt
1
32
56
66
65
76
85
asd
ADC
QWE
1111







2222
[root@localhost ~]#

#复制粘贴

#复制粘贴,将1-2行复制粘贴到最后一行下面
[root@localhost ~]# cat 1.txt | sed '1,2H;$G'
1
32
56
66
65
76
85
asd
ADC
QWE

1
32

#剪切粘贴 

#剪切粘贴,将1-2行剪切粘贴到最后一行下面
[root@localhost ~]# cat 1.txt | sed '1,2{H;d};$G'
56
66
65
76
85
asd
ADC
QWE

1
32
[root@localhost ~]#

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值