Shell脚本文本三剑客之Sed

目录

一、sed编辑器

1.1Sed概述

1.2Sed工作流程

1.3Sed基本用法

1.4Sed常用选项

1.5sed命令的常用操作

二sed命令的使用

查找打印内容

打印x行后退出

 打印指定行,行区间

 打印奇数偶数行

通过正则来打印

增(a、i、c)

大小写转换

  两个文件合并


一、sed编辑器

1.1Sed概述

  • sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流

1.2Sed工作流程

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

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

模式空间:简单理解就是一个缓冲区,sed从输入流中一行一行的取出内容放到这个缓冲区中按照SCRIPT(脚本)进行处理。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。  

1.3Sed基本用法

命令格式

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

1.4Sed常用选项

-e表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略,一般执行多个操作命令的时候会使用
-f表示用指定的脚本文件来处理输入的文本文件
-h显示帮助
-n禁止sed编辑器输出,即不自动打印,与p命令一起使用,又恢复自动打印,完成输出
-i备份文件文件并原处编辑
-r使用扩展正则表达式

1.5sed命令的常用操作

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

二sed命令的使用

查找打印内容

//先读取第一行,放入缓冲区,再按照命令处理,p打印
[root@localhost data]# sed -e 'p' users.txt 
1,zhangsan
1,zhangsan
2,lisi
2,lisi
3,wangwu
3,wangwu
4,zhaoliu
4,zhaoliu
5,qianqi
5,qianqi
6,zhuba
6,zhuba

//只有一个操作时,-e可加可不加,不加-n打印两遍
[root@localhost data]# sed  'p' users.txt 
1,zhangsan
1,zhangsan
2,lisi
2,lisi
3,wangwu
3,wangwu
4,zhaoliu
4,zhaoliu
5,qianqi
5,qianqi
6,zhuba
6,zhuba
 
#查找第二行内容,不加-n,否则会全部输出
[root@localhost data]# sed -n '2p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
 
#查找第1到3行内容
[root@localhost data]# sed -n '1,3p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 
#查看第一行和他后面的三行内容
[root@localhost data]# sed -n '1,+3p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
 
#查找第38行到最后一行的内容
[root@localhost data]# sed -n '38,$p' passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@localhost data]# 
 
#显示1-5行
[root@localhost data]# sed -e '5q' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 
#打印行号,不打印内容
[root@localhost data]# sed -n '=' users.txt 
1
2
3
4
5
6
 
#显示非打印字符
[root@localhost data]# sed -n 'l' users.txt 
1,zhangsan$
2,lisi$
3,wangwu$
4,zhaoliu$
5,qianqi$
6,zhuba$
 
#同时处理多条操作
[root@localhost data]# sed -n -e '=' -e 'p' users.txt 
1
1,zhangsan
2
2,lisi
3
3,wangwu
4
4,zhaoliu
5
5,qianqi
6
6,zhuba
[root@localhost data]# sed -n -e '=;p' users.txt 
1
1,zhangsan
2
2,lisi
3
3,wangwu
4
4,zhaoliu
5
5,qianqi
6
6,zhuba
[root@localhost data]# sed -n '
> =
> p
> ' users.txt
1
1,zhangsan
2
2,lisi
3
3,wangwu
4
4,zhaoliu
5
5,qianqi
6
6,zhuba


#查找含有root的行
[root@localhost data]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost data]# 
 
#查找包含bash或者root的行
[root@localhost data]# sed -nr '/bash|root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
 
#查找数字出现三次的行,使用扩展正则需要加上-r参数
[root@localhost data]# sed -n '/[0-9]{3}/p' passwd 
[root@localhost data]# sed -nr '/[0-9]{3}/p' passwd 
games:x:12:100:games:/usr/games:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin

实现一次性执行多条命令

    在'   '中使用;   即' ;  '

    -e  ' A '   -e  ' B '文件

-e '

  A

  B

' 文件

打印x行后退出

 sed  'xq'  文件

 打印指定行,行区间

打印一行内容

sed  -n  'xp'  文件   (x代表行号)

打印行号区间

sed  -n  '1,4'  testfile.sh 

sed  -n  '1,+3p'  testfile.sh    显示第一行之后连续三行内容,,,效果等同于1,4

 打印奇数偶数行

n的作用移动到下一行

 

通过正则来打印

 r

增(a、i、c)

sed '指定行范围a 指定内容' 文件名

        在指定第二行下增加内容

sed '指定行范围i 指定内容' 文件名

        在指定第二行上增加内容

 sed '指定行范围c 指定内容' 文件名

替换第三行内容

 指定第3到4行替换为指定行内容(多行变为一行)

 指定包含e的行替换为指定行内容

删除所有行

sed 'd'   文件

删除指定行

sed '1d'  文件

删除指定的多行

sed '2,8d'  文件

删除以s开头

sed  '/^s/d'  文件

删除以en结尾

sed  '/en$/d'  文件

删除除了en结尾的行

sed  '/en$/!'  文件

删除空行

sed  '/^$/d'  文件

sed  -n  '/^$/!p'  文件

删除包含2的行删除到第一个包含3的行,,,这里/2/看作一个字符串(如果后面还有2开头的会继续重复执行,,如果没有3开头会一直删到结尾)

sed  '/2/,/3/d'  文件

与正则表达式一起使用

删除结尾为bash或nologin的行

sed -r '/bash$|nologin$/d' /etc/passwd

从包含第1个字符串的行开始删除,到包含第2个字符串的位置停止删除

如果找不到第2个字符串的行,则删到最后一行

sed '/one/,/six/d' file1

删除1-3的行

格式

sed [选项] '行范围 s/旧字符串/新字符串/替换标记' 文件名

4种替换标记: .

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

//两个并一起代表空格

,,,删除空格 

 开头的空格用#代替

 加 -i才能对文件进行修改

 sed  -i '/swap/ s/^/#/' /etc/swap

不加范围,替换每行查找到的字符串

sed -n 's/root/admin/p' /etc/passwd

(swapoff  -a  关闭swap  临时关闭   /etc/rc.d/rc.local   里面添加swapoff  -a   添加权限+x    /etc/fstab永久关闭)


//root替换为admin,不加g和数字,默认替换每行第一个匹配到的root
[root@localhost data]# sed -n 's/root/admin/p' passwd 
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

//加数字2,替换每行匹配到的第二个root
[root@localhost data]# sed -n 's/root/admin/2p' passwd 
root:x:0:0:admin:/root:/bin/bash
 
//加g则是全部替换
[root@localhost data]# sed -n 's/root/admin/gp' passwd 
 

//删除前面的所有0
[root@localhost data]# echo 000000001010|sed 's/^0*//'
1010
 

//给1-3行加上注释
[root@localhost data]# sed '1,10 s/^/#/' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
 

//将所有root开头的行注释
[root@localhost data]# sed -n 's/^root/#root/p' passwd 
#root:x:0:0:root:/root:/bin/bash
[root@localhost data]# sed -n '/^root/ s/^/#/p' passwd 
#root:x:0:0:root:/root:/bin/bash
 
//注释fstab文件中的swap行
[root@localhost data]# sed -n '/swap/ s/^/#/p' /etc/fstab 
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost data]# sed -n 's/.*swap.*/#&/p' /etc/fstab 
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost data]# 
 
 sed '1,4{H;d};$G' t2         //H复制   d删除(即为剪切) G粘贴, $最后一行

 

大小写转换

sed中,使用\u表示大写,\l表示小写

1. 把每个单词的第一个小写字母变大写:

sed 's/\b[a-z]/\u&/g' filename

2. 把所有小写变大写:

sed 's/[a-z]/\u&/g' filename

3. 大写变小写:

sed 's/[A-Z]/\l&/g' filename

修改之后再保存 

 

 替换的符号

  两个文件合并

 两个文件合并

vim编辑器末行模式中  r加上要合并的文件

或者下图

或者cat命令

或者paste命令

 

 互换位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值