sed是一种流编辑器,一次处理一行,处理空间被称为模式空间,配合正则表达式与shell脚本使用广泛。
默认打印p选项
选项
-n 关闭默认打印
-i.bak 将原文件复制为.bak备份文件,并修改原文件
-r 配合扩展表达式
支持正则表达式,用/pattern/格式
地址界定
不给定地址 对全文进行处理
单地址 n:指定的行,$最后一行(区别正则表达式是词尾)
/pattern/:被正则表达式匹配到的行
地址范围 n,m 从第n行到第m行
n,+m 从第n行到n+m行
/pattern1/,/pattern2/ 从正则表达式首次匹配的行到第二次匹配的行
~:步进 1~2 从第一行开始,每隔两行=奇数行;
2~2 从第二行开始,每隔两行=偶数行
命令
p 打印
d 删除
a 匹配的行的下一行追加指定字符,若需加空格,需使用反斜杠\进行转义
c 替换指定行为指定内容
w 写匹配到的内容到指定文件
r 读取指定文件内容到匹配的行的下一行
= 匹配到的行打印出行号
! 取反,!位于地址界定与命令之间
s 替换,\1引用正则表达式得第一个分组,\2则代表第二个分组,依次类推,&代表匹配的内容
—- g表示全文替换,如果不加g,表示全文每行的第一个替换
变量用三个单引号引用
示例
用sed获取ifconfig得ip
ifconfig | sed -n ‘2p’ |sed -r ‘s/(^[^0-9]+)([0-9.]+)( .*$)/\2/’
正则表达式解释:(以非数字[^0-9]开头的内容)(数字.匹配1次或多次,匹配ip)(任意字符到词尾)
将ifconifg先取第二行,然后将该行分为三个部分,第一个括号表示从开头到非数字,第二个括号表示数字.,第三个表示空格到词尾,然后用\2取第二部分做替换,也就是取到ip部分
优化:只对第二部分进行分组,同时用该分组做替换即可
ifconfig | sed -n ‘2p’ |sed -r ‘s/^[^0-9]+([0-9.]+) .*$/\1/’
替换行内容,在行尾追加
sed -ri.bak ‘/^[[:space:]]+linux16/s@.*@&net.ifnames=0@’ /boot/grub2/grub.cfg