Linux三剑客-sed

sed是一款流编辑器,它一次处理一行内容,用来对文本进行过滤与替换操作;处理时,把当前处理的行存储在临时缓冲区中(模式空间)然后用sed命令处理缓冲区中的内容,处理完后把缓冲区的内容送往屏幕。

命令格式sed [option] ‘[地址定界] command’ file(s)常用option--version :显示sed 版本
--help   :显示帮助文档
-n,--quiet,--silent :静默输出,不打印至屏幕
-e       :允许多个指令被执行
-f       :从文件中读取指令
-i       :慎用,该选项将直接修改源文件
-r       :在指令中允许使用正则表达式常用地址定界* 不给地址全文处理
* 单地址:#:指定的行;/pattern/:被此处模式所能匹配到的每一行
* 地址范围:#,#; #,+#; /part/,/part/; #,/part/
* ~:按步长进常用commandd   :删除模式空间匹配的行,并立即启用下一轮循环
p   :打印当前模式空间内容,追加到默认输出之后
a   :在指定行后面追加文本,支持使用/n 多行追加
i   :在行前面插入文本,支持使用/n 多行插入
c   :替换单行或多行文本,支持使用/n
w   :保存模式匹配的行至指定文件
r   :读取指定文件的文本至模式空间中匹配到的行后
=   :为模式空间中的行打印行号
! :模式空间匹配取反
s///:查找替换
 g :表示行内全局替换
 l:下个字符转为小写
 L:把替换字母转为小写,直到U或E出现
 u:下个字符转为大写
 U:把替换字母转为大写,直到U或E出现
 E:停止以L或U开始的大小写转换

常用演示

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
# 匹配包含BOOT的行
[root@localhost test]# sed -n '/BOOT/p' ifcfg-ens33 #-n 不显示不匹配的行
BOOTPROTO="dhcp"
ONBOOT="yes"
#匹配以BOOT为开始的行,并在后面插入#IPV4INIT=no
[root@localhost test]# sed '/^BOOT/a #IPV4INIT=no' ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
#IPV4INIT=no
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
#删除以 #开始的行(注释行)
[root@localhost test]# sed '/^#/d' ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
# 重新编辑文件
[root@localhost test]# cat ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
# 编写sed.sh 脚本
[root@localhost test]# cat sed.sh 
/^$/d
#对文件ifcfg-ens33 执行 sed.sh 脚本
[root@localhost test]# sed -f sed.sh ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
#查找替换用-e
[root@localhost test]# sed -e 's/yes/no/' ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="no"地址定界演示#打印第一行开始的奇数行
[root@localhost test]# sed -n '1~2p' ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
DEFROUTE="yes"
# 删除指定行
[root@localhost test]# sed '2d' ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
#替换第4行n->N
[root@localhost test]# sed '4s/n/N/g' ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="No"命令演示[root@localhost test]# cat html

sed

h1 hello h1
h2 hell h2
h3 hel   h3


# 给第一个H标签加,给第二个H标签加
[root@localhost test]# cat sed.sh 
/h[0-9]/{
s///1
s///2
}
[root@localhost test]# sed -f sed.sh html 

sed

hello

hell

hel  

Sed的高级用法

command:命令=:显示行号n:读取匹配模式的行的下一行到模式空间中,模式空间中匹配模式的行被删除N:读取匹配模式的行和匹配模式的下一行h:拷贝模板快的内容到内存中的缓冲区,如果原来缓冲区有内容被覆盖H:追加模板块的内容到内存中的缓冲区g:获得内存缓冲区的内容,并替代当前模板块中的文本G:获得内存缓冲区的内容,并追加到当前模板块文本的后面d:删除pattern中的所有行,并读入下一新行到pattern中# 测试用例文本
moke@DESKTOP:~$ cat test
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
# = 用法; 显示ce 开头的行号
moke@DESKTOP:~$ sed "/^ce/=" test
zz xx tom xx tom rhce xx rh
2
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
# n用法;匹配zz开头的行的下一行tom改为TOM
moke@DESKTOP:~$ sed "/^zz/{n;s/tom/TOM/g}" test
zz xx tom xx tom rhce xx rh
ce xx xx TOM xx rhce xx TOM xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
# N用法;把zz开头的行和下一行中的rhce全部换成RHCA
moke@DESKTOP:~$ sed '/^zz/{N;s/rhce/RHCA/g}' test
zz xx tom xx tom RHCA xx rh
ce xx xx tom xx RHCA xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
# G,h,d,用法
moke@DESKTOP:/home$ cat tac
1
2
3
4
# 用sed 倒序
moke@DESKTOP:/home$ sed '1!G;h;$!d' tac
4
3
2
1

sed_macosxsed-i_sed命令

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!