sed 命令详解

sed 正则表达式特点
1)sed 文本工具支持:BREs、EREs
  sed 指令默认是使用"BREs"
  sed 命令参数 “-r ” ,则表示要使用“EREs"
2)sed 功能与作用
  a. sed 处理的对象:文本文件
  b. sed 处理操作:对文本文件的内容进行 --- 查找、替换、删除、增加等操作
  c. sed 在处理文本文件的时候,也是按行处理的
sed 格式:sed 选项 '位置命令(哪些位置做什么操作)' 读入的文件

常用选项:
  -n 不输出模式空间内容到屏幕,即不自动打印
  -e 多点编辑
  -r 支持使用扩展正则表达式
  -i.bak 备份文件并原处编辑

       -i 不备份文件并修改

位置定界:
  (1) 不给地址:对全文进行处理
  (2) 单地址:
    #:指定的行,$:最后一行
    /pattern/:被此处模式所能够匹配到的每一行
  (3) 地址范围:
    #,#
    #,+#
    /pat1/,/pat2/
    #,/pat1/
编辑命令:
  d 删除模式空间匹配的行,并立即启用下一轮循环
  p 打印当前模式空间内容,追加到默认输出之后
  a []text 在指定行的下一行追加文本,支持使用 实现多行追加
  i []text 在指定行的上一行插入文本
  c []text 替换行为单行或多行文本
  w /path/file 保存模式匹配的行至指定文件
  r /path/file 读取指定文件的文本至模式空间中匹配到的行后
  = 为模式空间中的行打印行号
  ! 模式空间中匹配行取反处理


sed工具还有一个专门用于搜索替换的 (可以不用位置直接使用,也可以在指定位置后面,当做命令使用)
  格式:s/// 查找替换,支持使用其它分隔符,s@@@,s###
  替换标记:
    g 行内全局替换
    p 显示替换成功的行
    w /PATH/FILE 将替换成功的行保存至文件中

sed 工作原理,每次读取文本中的一行,也是逐行处理,将读取的一行放到“模式空间”,进行处理,比如查看,打印,修改等,然后就在“模式空间”把这一行删掉,然后再加载下面一行。在模式空间中,默认的不需要做什么操作,就会自动把这一行打印出来。相当于模式空间中内置了 print操作。
  sed 格式:sed 选项 '位置命令(哪些位置做什么操作)' 读入的文件
    sed '' /etc/passwd //没有选项,没有位置,默认就是全文,没有操作,默认就是打印的操作。所以就会把/etc/passwd 文件内容全部打印出来
    sed 支持管道的,也就是可以把命令的执行结果传给sed。 ifconfig eth0 | sed -n '2p' //位置2,操作是p。打印第二行
    位置格式除了,固定的位置,也可以使用正则表达式来匹配相应的位置 sed -n '/^U/p' /etc/fstab // 以U开头的行,打印

  位置也可以使用一个地址范围,比如 从第几行到第几行,从第几行往后几行,从一个模式到另一个模式中间的几行,从第几行到符合模式的行的中间
  seq 10 | sed -n '3,5p' ///打印第三行到第五行的内容。

例子

sed -n '/^b/,/^f/p' //-n 关闭自动打印,显示b开头 与f开头之间的行 面试题,找出几点几分到几点几分的日志信息

sed '/^#/d' /etc/fstab //位置是以#号开头的行,操作是d删除。 以#开头的行 不显示 ,这些只是显示结果,不会改变文件的内容
sed '/^#/d' /etc/fstab |sed '/^$/d' //不显示#号开头的行,并且不显示空行
sed '/^#/d;/^$/d' /etc/fstab //使用两个正则表达式条件,不显示#号开头的行,并且不显示空行
seq 10 | sed -n '1~2p' //步进 1~2 奇数行 2~2 偶数行
sed -n '2p' sed -n '$p'
sed 10|sed '1~2a line' //位置是1~2,操作是a line 表示在匹配的行的下一行追加line
sed -i.bak '/^root/a line firename' //在 root开头的行的下一行追加一行firename -i 会把修改的内容写到文件里。 -i.bak 是先把文件备份成.bak后缀,然后再修改源文件
sed -i.bak '/^Listen/a listen 8080' /etc/httpd/conf/httpd.conf //先把httpd.conf 备份成.bak文件,然后再源文件的Listen开头的行,下一行添加listen 8080
sed -i.bak '/^Listen/i listen 8080' /etc/httpd/conf/httpd.conf //操作i 是在匹配行的上一行添加


sed -i.bak '/^Listen/i listen 8080' /etc/httpd/conf/httpd.conf //添加的前面有空格
sed -i.bak '/^Listen/c listen 8080' /etc/httpd/conf/httpd.conf //操作c 是替换
sed '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config /// 位置是‘SELINUX=’开头的行,操作是c 替换成SELINUX=disabled 搜索出的这一行 替换掉
sed '/^#/d;w /data/httpd.conf' /etc/httpd/conf/httpd.conf ///位置是#开头的行,操作是d;w 先删掉,然后再另存为/data/httpd.conf 把#号开头的行删掉,然后另存为
sed 's/root/ROOT/g' passwd //搜索替换,把root替换成ROOT,不加g的话默认只替换第一个,g是全部的意思,搜索出来的全部替换成
sed -i.bak 's/^[0-9]+$/this is tihuan!!/g' cattest.txt ///使用搜索替换和操作c效果一样
sed -i.bak '/^[0-9]+$/c this is tihuan!!' cattest.txt ///使用搜索替换和操作c效果一样
sed -i.bak '/^root/,/^<root/s/#//g' list.txt //////找到 root与<root 之间的位置 做全局的搜索替代g,把#都删掉了,然后保存到了源文件中
sed -n '/#<VirtualHost/,/#</VirtualHost/s@#@@p' /etc/httpd/conf/httpd.conf //找到这个节点,做搜索替换,把#删掉


[root@centos7 data]#ifconfig eth0|sed -n '2s/^.*inet //;s@ netmask.*$@@p' ///对于第二行 做搜索替代,然后p打印
[root@centos6 data]#ifconfig eth0 | sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*$)/2/p' ///分组替代
[root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@1@' ///分组替代
/etc/sysconfig/
[root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@2@' ///分组替代
network-scripts


sed -rn '/^[[:space:]+linux16]/s#(.*)#1 我想假加的字符串 #p' /boot/grub2/grub.cfg //找到linux16的行,在行的最后面加上你想要的东西
sed -rn '/^[[:space:]+linux16]/s#(.*)#1 net.ifnames=0 #p' /boot/grub2/grub.cfg //这个命令会把网卡名字改为传统的网卡 eth1.。。。

[root@centos7 data]#sed 's/'''$var'''/wang/' passwd ///使用变量 '''


sed -rn '/rhgb quiet/s#(.*)(rhgb quiet)("$)#12 int int 3#p' /etc/default/grub

[root@centos7 Packages]#ls *.rpm|sed -r 's/.*.(.*).rpm$/1/'|sort|uniq -c //查看rpm前面的架构都有哪几种 分别的个数
  2258 i686
  3122 noarch
  4639 x86_64
[root@centos7 Packages]#ls *.rpm|rev|cut -d. -f2|rev|sort |uniq -c
  2258 i686
  3122 noarch
  4639 x86_64

要有多努力才能对得起奔波的脚步和身上的期望
原文地址:https://www.cnblogs.com/hxfcodelife/p/13442894.html