Shell编程正则表达式sed

目录

定义

sed (Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除替换,添加,移动等),最后输出所有行或者仅输出处理的某些行。

工作流程

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

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注:默认情况下所有的sed命令都是在模式空间内执行的,由此输入的文件并不会发生任何变化,除非是用重定向存储输出。

常见用法

  • sed [选项] ‘操作’ 参数
  • sed [选项] -f scriptfile 参数

常见的sed命令选项主要包含以下几种

  • -e script(脚本命令) : 指定sed编辑命令
  • -f scriptfile(文件) : 指定的文件中是sed编辑命令
  • -h 或 --help :显示帮助
  • -n,–quiet 或 silent :表示仅显示处理后的结果
  • -i :直接编辑文本文件(会对文件产生变化)

常见的操作包含以下几种

  • a: 增加,在当前行下面增加一行指定内容
  • c:替换,将选定行替换为指定内容
  • d:删除,删除选定的行
  • i:插入,在选定行上面插入一行指定内容
  • p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。(输出)
  • s:替换,替换指定字符
  • y:字符转换

输出内容

带行号输出所有内容 等同于 cat test.txt

[root@server2 ~]# nl test.txt | sed -n 'p'

在这里插入图片描述

输出第4行,或者3到5行

[root@server2 ~]# nl test.txt | sed -n '4p'
[root@server2 ~]# nl test.txt | sed -n '3,5p

在这里插入图片描述

输出偶数行;奇数行

[root@server2 ~]# nl test.txt | sed -n 'n;p'
[root@server2 ~]# nl test.txt | sed -n 'p;n'

在这里插入图片描述

输出1到6行之间的偶数行,3到9行之间的奇数行

[root@server2 ~]# nl test.txt | sed -n '1,6{n;p}'
[root@server2 ~]# nl test.txt | sed -n '3,9{p;n}'

在这里插入图片描述

输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)

[root@server2 ~]# nl test.txt | sed -n '6,${n;p}'

在这里插入图片描述

输出包含the的内容

[root@server2 ~]# sed -n '/the/p' test.txt

在这里插入图片描述

输出从第3行开始到第一个包含the的行(是一个区间过程)

[root@server2 ~]# nl test.txt | sed -n '3,/the/p' 

在这里插入图片描述

扫描二维码关注公众号,回复: 12097643 查看本文章

输出包含the的所在行的行号(等号用来输出行号)

[root@server2 ~]# sed -n '/the/=' test.txt

在这里插入图片描述

输出以PI为开头的内容;以0到9数字为结尾的内容

[root@server2 ~]# sed -n '/^PI/p' test.txt
[root@server2 ~]# sed -n '/[0-9]$/p' test.txt

在这里插入图片描述

输出包含单词home的行(<> 代表单词边界)

[root@server2 ~]# sed -n '/\<home\>/p' test.txt
[root@server2 ~]# grep 'home' test.txt 

在这里插入图片描述

  • 注:nl :命令用于计算文件的行数

删除内容

删除第5行;删除2到4行

[root@server2 ~]# nl test.txt | sed '5d'
[root@server2 ~]# nl test.txt | sed '2,4d'

在这里插入图片描述

仅在外部输出删除,不会对源文件产生影响

删除除了包含单词home的内容的其它所有行

[root@server2 ~]# nl test.txt | sed '/home/!d'    
3	The home of Football on BBC Sport online.

删除以a-z小写字母为开头的内容

[root@server2 ~]#  sed '/^[a-z]/d' test.txt 

在这里插入图片描述

删除以.为结尾的内容

[root@server2 ~]#  sed '/\.$/d' test.txt 

在这里插入图片描述

删除所有空行

[root@server2 ~]# vi test.txt 
[root@server2 ~]#  sed '/^$/d' test.txt 

在这里插入图片描述

替换内容

将每行中的第一个the替换为THE

[root@server2 ~]# sed 's/the/THE/' test.txt 

在这里插入图片描述
在这里插入图片描述

将文件中的所有the替换为THE

[root@server2 ~]# sed 's/the/THE/g' test.txt 

在这里插入图片描述

将每行中的第2个l替换为L

[root@server2 ~]# sed 's/l/L/2' test.txt 

在这里插入图片描述

将文件中的所有的o删除(替换为空串)

[root@server2 ~]# sed 's/o//g' test.txt 

在这里插入图片描述

在每行行首插入#号

[root@server2 ~]# sed 's/^/#/' test.txt 

在这里插入图片描述

在每行行尾插入字符串EOF

[root@server2 ~]# sed 's/$/EOF/' test.txt 

在这里插入图片描述

在包含the的每行行首插入#号

[root@server2 ~]# sed '/the/s/^/#/' test.txt 

在这里插入图片描述

将包含the的所有行中的o替换为O

[root@server2 ~]# sed '/the/s/o/O/g' test.txt 

在这里插入图片描述

  • 注:H:复制到剪切板 g,
  • G :将剪切板中的数据覆盖/追加至指定行
  • w:保存为文件
  • r:读取指定文件
  • a:追加指定内容

修改内容

将包含the的行迁移至文件末尾,{;}用于多个操作

[root@server2 ~]# sed '/the/{H;d};$G' test.txt

在这里插入图片描述

将第1-4行内容转移至第16行后

[root@server2 ~]# sed '1,4{H;d};16G' test.txt

在这里插入图片描述

将包含the的行另存为文件out.file

[root@server2 ~]# sed '/the/w out.file' test.txt 
[root@server2 ~]# ls -lh
[root@server2 ~]# cat out.file 

在这里插入图片描述
在这里插入图片描述

将文件/etc/hostname的内容添加到包含the的每行以后

[root@server2 ~]# sed '/the/r /etc/hostname' test.txt 

在这里插入图片描述

在第三行前面插入一个新行,内容为New

[root@server2 ~]# sed '3iNew' test.txt

在这里插入图片描述

在包含the的每行后插入一个新行,内容为New

[root@server2 ~]# sed '/the/aNew' test.txt 

在这里插入图片描述

在文件最后结尾后插入一个新行,内容为New

[root@server2 ~]# sed '$aNew' test.txt 

在这里插入图片描述

在第三行后插入一个新行,内容为New1,后换行插入一个新行,内容为new2

(中间的\n表示换行)

[root@server2 ~]# sed '4aNew1\nnew2' test.txt 

在这里插入图片描述

  • 注意:\n 和\r的区别:
    \n 换行符,是另起一新行(光标换行)
    \r 回车符,光标回到一旧行的开头(覆盖前一个)

使用脚本编辑文件

使用sed脚本将多个编辑指令存放到文件中执行

[root@server2 ~]# vi opt.list
1,5H   15行剪切
1,5d   15行删除
17G     17行追加
[root@server2 ~]# sed -f opt.list test.txt 

在这里插入图片描述

sed直接操作文件示例

编写一个脚本,用来调整vsftpd 服务配置,要求禁止匿名用户,但允许本地用户

[root@server2 ~]# useradd dada
[root@server2 ~]# passwd dada
[root@server2 ~]# useradd xiaoxiao
[root@server2 ~]# passwd xiaoxiao
[root@server2 ~]# vi ftp.sh
#!/bin/bash
A=vsftpd
FTP=/etc/vsftpd/vsftpd.conf
yum -y install $A
sed -i -e '/local_enable/s/NO/YES/g' $FTP
sed -i -e '/write_enable/s/NO/YES/g' $FTP
sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP
sed -i  '$aallow_writeable_chroot=YES' $FTP
sed -i -e '/listen/s/NO/YES/g' $FTP
sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP
systemctl start $A
netstat -anpt | grep $A
[root@server2 ~]# chmod +x ftp.sh
[root@server2 ~]# ./ftp.sh

在这里插入图片描述
客户机上安装ftp进行访问

[root@server1 ~]# yum -y install ftp
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): dada
ftp> exit
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): xiaoxiao
ftp> exit

在这里插入图片描述
验证成功

猜你喜欢

转载自blog.csdn.net/weixin_49343462/article/details/109636744