sed - stream editor for filtering and transforming text 命令格式:sed [OPTION]... {script-only-if-no-other-script} [input-file] 执行流程:按行读取内容到模式空间;匹配内容;执行增删改查操作
参数:
-n: 取消模式空间默认输出 -r: 使其支持拓展正则
增删改查
1 2 3 4 5 6 7 8
p: 打印 d: 删除 delete
c: 替换一行的内容 a: 指定行后面追加内容 i: 指定行前面插入内容
s: 替换 substitute
查 p
注意: 只想输出指定内容时,一定要使用 -n 参数 (sed -n ...),取消模式空间默认输出
1 2 3 4 5
'np': 查第 n 行, 注意不是 /n/ 'm,np': 查 m 到 n 行 '/regexp/p': 查 // 中表达式命中的行,类似grep '/reg1/,/reg2/p': 查表达式1命中的行,到表达式2命中的行。注意:如果表达式2没有命中内容,则会一直查到文件结尾,并输出。 'n,/reg/p': 混用
删 d
1 2
'nd':删除第n行 '$d':删除最后一行
增 a,i
1 2
'ni str': 在第n行前插入 str\n 'na str': 在第n行后增加 str\n
替换 s
格式:sed 's/old/new/g' 将 old(可以是表达式),匹配到的内容,替换成 new
/: 三个’/‘ 是分隔符,也可以用其它的符号表示, 如:’#’、‘@’
g: 全局替换,不加 ‘g’ 默认只替换每行第一个匹配到的内容
例子
1 2 3 4 5 6 7 8 9 10 11 12
# 打印配置,排除空行、注释 sed -r '/^$|^#/d' /etc/profile # 默认不修改文件,打印删除后的内容 sed -nr '/^$|^#/!p' /etc/profile # '!' 取反, !p,表示不打印命中的内容
# 分组 \1, \2 ... 引用内容 echo hello world | sed -r 's/(.*) (.*)/\2 \1/' # 交换前后两个单词的位置
# 取所有网卡 ip ip addr | sed -nr '/^ +inet .*/p' | sed -r 's#^.* (.*)/.*#\1#' # 取eth0网卡 ip ip addr show eth0 | sed -n '3p' | sed -r 's#^.* (.*)/.*#\1#' ip addr show eth0 | sed -nr '3s#^.* (.*)/.*#\1#p' # 打印行、替换合并版