Shell编程正则表达式sed

   日期:2020-11-14     浏览:107    评论:0    
核心提示:目录定义工作流程常见用法常见的sed命令选项主要包含以下几种常见的操作包含以下几种输出内容带行号输出所有内容 等同于 cat test.txt输出第4行,或者3到5行输出偶数行;奇数行输出1到6行之间的偶数行,3到9行之间的奇数行输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)输出包含the的内容输出从第3行开始到第一个包含the的行(是一个区间过程)输出包含the的所在行的行号(等号用来输出行号)输出以PI为开头的内容;以0到9数字为结尾的内容输出包含单词home的行(<>

目录

    • 定义
    • 工作流程
    • 常见用法
    • 常见的sed命令选项主要包含以下几种
    • 常见的操作包含以下几种
    • 输出内容
      • 带行号输出所有内容 等同于 cat test.txt
      • 输出第4行,或者3到5行
      • 输出偶数行;奇数行
      • 输出1到6行之间的偶数行,3到9行之间的奇数行
      • 输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)
      • 输出包含the的内容
      • 输出从第3行开始到第一个包含the的行(是一个区间过程)
      • 输出包含the的所在行的行号(等号用来输出行号)
      • 输出以PI为开头的内容;以0到9数字为结尾的内容
      • 输出包含单词home的行(<> 代表单词边界)
    • 删除内容
      • 删除第5行;删除2到4行
      • 删除除了包含单词home的内容的其它所有行
      • 删除以a-z小写字母为开头的内容
      • 删除以.为结尾的内容
      • 删除所有空行
    • 替换内容
      • 将每行中的第一个the替换为THE
      • 将文件中的所有the替换为THE
      • 将每行中的第2个l替换为L
      • 将文件中的所有的o删除(替换为空串)
      • 在每行行首插入#号
      • 在每行行尾插入字符串EOF
      • 在包含the的每行行首插入#号
      • 将包含the的所有行中的o替换为O
    • 修改内容
      • 将包含the的行迁移至文件末尾,{;}用于多个操作
      • 将第1-4行内容转移至第16行后
      • 将包含the的行另存为文件out.file
      • 将文件/etc/hostname的内容添加到包含the的每行以后
      • 在第三行前面插入一个新行,内容为New
      • 在包含the的每行后插入一个新行,内容为New
      • 在文件最后结尾后插入一个新行,内容为New
      • 在第三行后插入一个新行,内容为New1,后换行插入一个新行,内容为new2
    • 使用脚本编辑文件
      • 使用sed脚本将多个编辑指令存放到文件中执行
    • 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' 

输出包含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


验证成功

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服