Linux三剑客:sed的基本使用

目录

认识sed

使用sed

命令格式

常用选项options

地址定界

命令command

sed用法演示

常用选项options演示

地址界定演示

命令command演示

sed高级编辑命令


认识sed

sed 是一种流编辑器,它一次处理一内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i

功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作

使用sed

命令格式

sed` `[options] ``'[地址定界] command'` `file``(s)

常用选项options

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行

  • -e:多点编辑,对每行处理时,可以有多个Script

  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写

  • -r:支持扩展的正则表达式

  • -i:直接将处理的结果写入文件

  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界

  • 不给地址:对全文进行处理

  • 单地址:

    • #: 指定的行

    • /pattern/:被此处模式所能够匹配到的每一行

  • 地址范围:

    • #,#

    • #,+#

    • /pat1/,/pat2/

    • #,/pat1/

  • ~:步进

    • sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)

    • sed -n '2~2p' 只打印偶数行

编辑命令command

  • d:删除模式空间匹配的行,并立即启用下一轮循环

  • p:打印当前模式空间内容,追加到默认输出之后

  • a:在指定行后面追加文本,支持使用\n实现多行追加

  • i:在行前面插入文本,支持使用\n实现多行追加

  • c替换行为单行或多行文本,支持使用\n实现多行追加

  • w:保存模式匹配的行至指定文件

  • r:读取指定文件的文本至模式空间中匹配到的行后

  • =:为模式空间中的行打印行号

  • !:模式空间中匹配行取反处理

  • s///:查找替换,支持使用其它分隔符,如:
  • s@@@
  • s###
  • 加g表示行内全局替换;
  • 在替换时,可以加一下命令,实现大小写转换
    • \l:把下个字符转换成小写。

    • \L:把replacement字母转换成小写,直到\U或\E出现。

    • \u:把下个字符转换成大写。

    • \U:把replacement字母转换成大写,直到\L或\E出现。

    • \E:停止以\L或\U开始的大小写转换

sed用法演示

常用选项options演示

[root@centos111 test]# cat demo 
aaa
bbbb
AABBCCDD

[root@centos111 test]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD

//匹配或者不匹配都会打印
[root@centos111 test]# sed -n "/aaa/p" demo#-n不显示没匹配的行
aaa
//仅显示匹配到的行
[root@centos111 test]# sed -e "s/a/A/g" -e "s/b/B/g" demo  #-e多点编辑
AAA
BBBB
AABBCCDD
//查找到a替换为大写A,查找到b替换为B
[root@centos111 test]# cat sedscript 
s/A/a/g
//这里的规则是将A查找到替换为小写a
[root@centos111 test]# sed -f sedscript  demo #-f使用文件进行处理
aaa
bbbb
aaBBCCDD

//即sedscript里面写了一个规则,用这个文件来处理demo
[root@centos111 test]# sed -i.bak "s/a/A/g" demo  #-i是直接对文件进行处理
//这里直接处理的源文件,并且将源文件在修改前备份了一份
[root@centos111 test]# cat demo.bak 
aaa
bbbb
AABBCCDD
//原文件
[root@centos111 test]# cat demo
AAA
bbbb
AABBCCDD
//修改后的文件

地址界定演示

[root@centos111 test]# cat demo
aaa
bbbb
AABBCCDD

[root@centos111 test]# sed -n "p" demo    #打印全文
aaa
bbbb
AABBCCDD

[root@centos111 test]# sed "2s/b/B/g" demo #替换第二行的b->B
aaa
BBBB
AABBCCDD

[root@centos111 test]# sed -n "1,2p" demo #打印1,2行
aaa
bbbb
[root@centos111 test]# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
//第二行到DD行打印出来
[root@centos111 test]# sed "1~2s/[aA]/E/g" demo
EEE
bbbb
EEBBCCDD
//将奇数行的a和A替换为E

编辑命令command演示

[root@centos111 test]# cat demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed "2d" demo
aaa
AABBCCDD
//删除第二行
[root@centos111 test]# sed "2a123" demo
aaa
bbbb
123
AABBCCDD
在第2行后面增加了123
[root@centos111 test]# sed "1i123" demo
123
aaa
bbbb
AABBCCDD
//在第一行前面增加了123
[root@centos111 test]# sed "3c123" demo
aaa
bbbb
123
//替换第三行的内容为123
[root@centos111 test]# sed -n "3w/root/demo3" demo
//将第三行的内容保存到/root/demo3中
[root@centos111 test]# cat /root/demo3 
AABBCCDD
//这里查看demo3的内容
[root@centos111 test]# sed "1r/root/demo3" demo
aaa
AABBCCDD
bbbb
AABBCCDD
//读取/root/demo3中的内容到demo文件的第一行后
[root@centos111 test]# sed -n "=" demo
1
2
3
//打印行号
[root@centos111 test]# sed -n '2!p' demo
aaa
AABBCCDD
//打印了第二行的内容
[root@centos111 test]# sed 's@[a-z]@\u&@g' demo
AAA
BBBB
AABBCCDD
//将所有的小写替换为了大写

sed高级编辑命令

(1)格式

  • h:把模式空间中的内容覆盖至保持空间中

  • H:把模式空间中的内容追加至保持空间中

  • g:从保持空间取出数据覆盖至模式空间

  • G:从保持空间取出内容追加至模式空间

  • x:把模式空间中的内容与保持空间中的内容进行互换

  • n:读取匹配到的行的下一行覆盖 至模式空间

  • N:读取匹配到的行的下一行追加 至模式空间

  • d:删除模式空间中的行

  • D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

例如:倒序输出文本内容

[root@centos111 test]# cat num 
One
Two
Three
[root@centos111 test]# sed '1!G;h;$!d' num 
Three
Two
One

其中:

1!G 第一行不执行G命令,从第二行开始执行

​ $!d 最后一行不删除 

Linux三剑客:sed的基本使用_第1张图片

总结模式空间与保持空间关系:

保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理

(2)演示

① 显示偶数行

[root@centos111 test]# seq 9 |sed -n 'n;p'
2
4
6
8

② 倒序显示

[root@centos111 test]# seq 9 | sed '1!G;h;$!d'
9
8
7
6
5
4
3
2
1

③ 显示奇数行

[root@centos111 test]# seq 9 | sed 'H;n;d'
1
3
5
7
9

④ 显示最后一行

[root@along ~]# seq 9| sed 'N;D'
9

⑤ 每行之间加空行

[root@centos111 test]# seq 9 | sed 'G'
1

2

3

4

5

6

7

8

9

⑥ 把每行内容替换成空行

[root@centos111 test]# seq 9 | sed "g"









-------------------------------------------

⑦ 确保每一行下面都有一个空行

[root@centos111 test]# seq 9 | sed '/^$/d;G'
1

2

3

4

5

6

7

8

9

(3)实战案例:

假如有一个源码需要我们使用shell脚本来进行安装git,那么我们可以试着用sed来实现

首先创建一个脚本:

vim script.sh

内容如下:

#!/bin/bash
if
[[ $(id -u) -ne 0  ]];
then echo "this script must be run root!!!"
sudo su;fi
echo "this script requires git"
yum install -y git
echo "set selinux to disabled"
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config 
#这里是进入到selinux中使用sed将enforcing替换为disabled 

为该脚本授予执行权限:

[root@centos111 test]# chmod +x  script.sh

为了测试我们可以先切换到普通用户:

[user1@centos111 test]$ ./script.sh 
this script must be run root!!!

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] user1 的密码:

这里我输完密码后就会自动跳转到root用户下

然后我们在root用户下进行执行

[root@centos111 test]# ./script.sh 
this script requires git
//然后这里就会自动下载git
...

安装完成后,我们可以去看看/etc/selinux/config文件是否被修改

Linux三剑客:sed的基本使用_第2张图片

可以看到这里selinux已经被修改了,说明我们成功的用sed替换成功了!

你可能感兴趣的:(安全,linux,linux,服务器,mysql,sed,运维,web安全,安全)