三剑客之sed命令-----------不知白日暮,欢赏夜方归。

三剑客之sed命令

sed是流式编辑器,一次处理一行内容,自动编辑一个或者多个文件。
sed和 grep 不一样,不管是否找到指定的模式,它的退出状态都是0,只有命令存在语法错误时,sed的退出状态才不是0

sed全称(stream editor)流式编辑器,Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等,工作流程如下

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在
临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完
成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出,或者使用sed -i选项
-i选项就是将本该输出到屏幕上的内容输出/流入文件中

sed命令:

命令: sed
命令由'地址+命令'组成
参数:
-r 支持扩展正则符号
-e 允许多项编辑
-n 取消默认输出
-i inplace编辑源文件
-f 指定sed脚本文件名

sed常用命令

sed 内使用命令:
# p 打印
# d 删除
# s 替换
# g 全局
# i 在当前行之前插入文本
# ! 取反
# r 读取文se件
# w 写入文件
# a 在当前行后添加一行或多行
# c 新文本修改当前行中文本
# l 会用$符号标识出文件中看不到的字符的位置
# q 退出或结束
# y 将字符转换为另一个字符不支持正则

模式空间与保持空间

sed 有两个内置的存储空间:

- 模式空间(pattern space):
如你所知,模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。
保持空间(hold space):
保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。

我们已经讨论过,每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。

模式空间与保持空间的操作命令

x:命令x(exchange) 用于交换模式空间和保持空间的内容

h:模式空间复制/覆盖到保持空间
H:模式空间追加到保持空间

g:保持空间复制/覆盖到模式空间
G:保持空间追加到模式空间

n:读取下一行到/覆盖到模式空间
N:将下一行添加到模式空间

d:删除pattern space中的所有行,并读入下一新行到pattern space中

示例:交换文件的行

cat test.txt
1111
2222
3333

方式1:

tac test.txt
3333
2222
1111

方式2:

思路:
# 1、读取文件第一行内容到模式空间,进行的操作如下
# 将模式空间内容覆盖到保持空间
# 删除模式空间内容

2、读取文件第二行内容到模式空间,进行的操作如下

将保持内容追加到模式空间

将模式空间内容覆盖到保持空间

删除模式空间内容

3、读取文件第三行内容到模式空间,进行的操作如下

将保持空间内容追加到模式空间

实现:
sed -r '1h;1d;2G;2h;2d;3G' test.txt
或者
sed '1!G;h;$!d' test.txt

五 sed脚本

sed脚本就是写在文件中的一系列sed命令,使用-f 选项指定sed脚本文件名,需要注意的问题如下

  • 脚本末尾不能有任何多余的空格或文本

  • 如果命令不能独占一行,就必须以\结尾

  • 脚本中不能使用引号,除非它们是查找串的一部分

  • 反斜杠起到续行的作用

    cat sed.sh #永久存储,存了多行sed命令,相当于多道关卡,每读入一行内容将经历一道道关卡
    1h;1d;2G;2h;2d;3G
    1h;1d;2G;2h;2d;3G

    sed -r '' a.txt
    1111
    2222
    3333
    sed -r -f sed.sh test.txt
    3333
    2222
    1111
    2222
    1111

sed练习题

过滤出用户名组成是字母+数字+字母的行
显示出/etc目录下所有包含root的文件名
过滤掉/etc/ssh/sshd_config内所有注释和所有空行
删除配置文件中用井号#注释的行
删除配置文件中用双斜杠//注释的行
删除无内容空行
追加一行,\可有可无,有更清晰
给文件每行加注释
每指定行加注释
把/root目录下所有的.sh文件名前增加oldboy
将https://www.cnblogs.com/网站中的所有链接替换成https://www.test.com/
删除centos7系统/etc/grub2.cfg⽂件中所有以空⽩开头的⾏⾏⾸的空⽩字符。
删除/etc/fstab⽂件中所有以#开头,后⾯⾄少跟⼀个空⽩字符的⾏的⾏⾸的# 和空⽩字符。
在/etc/fstab⽂件中不以#开头的⾏的⾏⾸增加#号。
利⽤sed 取出ifconfig命令中本机的IPv4地址

posted @ 2021-07-28 19:05  郝怕怕  阅读(78)  评论(0)    收藏  举报