sed是流编辑器(stream editor),可以对文本文件和标准输入进行编辑,标准输入可以来自键盘.文件重定向.字符串.变量,甚至来自管道的文本
sed工作流程:
读取标准输入或文本数据,-->>复制到缓冲区-->读取命令或脚本第一个命令-->在缓冲区中操作, 不断重复 ,可以看出,它只对缓冲区内的内容进行修改,不直接作用于文件
如果想保存需要重定向或者用-w选项
sed命令格式
sed 选项 '命令' 需要处理的文件 注意:需要用单引号将sed命令引起来
sed脚本文件需要用#!/bin/sed -f (-f表示正在调用脚本文件)
sed常用选项: -n 如果不加此选项,sed命令会先将整个文本打印一遍,然后如果有匹配行,还会将匹配行再打印一遍,加上后仅仅打印指定位置
-e 如果只有一个命令,那么可以忽略,如果有多条指令,-e 选项将下一个字符串解析为sed编辑命令
-f 表示正在调用sed脚本文件
sed命令通常由定位文本行 和 编辑命令 组成
定位文本行: 1:行号 2:使用正则
sed命令定位文本方法
选项 | 意义 |
x | x为指定行号 |
x,y | 指定从x到y |
/pattern/ | 查询包含模式的行 |
/pattern/pattern/ | 查询包含两个模式的行 |
/pattern/,x | 从模式匹配到x之间的行 |
x,/pattern/ | 从x到模式匹配之间的行 |
x,y! | 不包括x和y行号的行 |
sed编辑命令
选项 | 意义 |
p | 打印匹配行 |
= | 打印文件行号 |
a\ | 在定位行号的下一行追加文本信息(注意是对行操作) |
i\ | 在定位行号的前一行 |
d | 删除定位行(注意没有\) |
c\ | 用新文本替换定位文本行(针对行) |
s | 替换文本(针对具体字符串) s/被替换的字符串/新字符串/[替换选项] |
r | 从另一个文件中读文本 |
w | 将文本写入到一个文件 |
y | 变化字符(针对字符) sed 'y/1234/abcd/' input |
q | 从头开始匹配并打印,如果匹配到就立即退出,不打印后续 |
l(字符) | 显示控制字符 sed -n '1,$l' input 显示从第一行到最后一行控制字符 |
{} | 在定位行执行命令组;sed -n '/hello/{p;=}' input,中间用;隔开 |
n | 读取下一个输入行,用下一个命令处理新的行 |
h | 将模式缓冲区复制到保持缓冲区(覆盖) |
H | 将模式缓冲区追加到保持缓冲区(追加) |
x | (将保持缓冲区的内容和模式缓冲区的内容互换) |
g | 将保持缓冲区的内容复制到模式缓冲区(覆盖) |
G | 将保持缓冲区的内容追加到模式缓冲区(追加) |
注意事项:
sed不支持同时带多个编辑命令的用法,比如:sed -n '/hello/p=' input xx 应该使用 sed -n -e '/hello/=' -e '/hello/p' input
-f 选项只有调用sed脚本文件时才起作用,sed对脚本要求比较严格,不要有多余的空格什么的,如果依然报错加上\试试,换行也需要加入\
如果匹配字符中有元字符,需要用\转义
$在正则中表示行尾,在sed中表示最后一行 比如: sed '$p' input #打印最后一行
注意sed命令格式 :sed 选项 模式 文件 其中模式如果用正则,依然需要遵循sed模式,比如sed -n '/.*bus/p' input (匹配以bus结尾的字符串) 这两个//不能少
s/ :替换时,先匹配需要替换的字符串,匹配成功后替换,[替换选项做进一步的细化;选项有w(保存) g(全局) p]
还可以加上第几次匹配,比如 sed -n 's/hello/HELLO/3p' input 将会显示第3次匹配时打印
& 符号表示保存被替换的字符串以供下面调用 比如 sed -n 's/hello/(&)/p' input 将会把匹配到的hello替换为(hello) ,和命令 sed -n 's/hello/(hello)/p' input 意义一样
注意q的用法 ;从头开始匹配并打印,如果匹配到就立即退出,不打印后续
=========================================以上为一些基本命令==============================================
高级命令
n: 在下一行(注意是一行,只对一行启作用)执行下一条指令,常常与{}合用
-e {} ; 都用于多条命令
更高级用法: sed' #sed命令开始
> s/hello/HELLO/
> s/world/WORLD/
>$d ' sed input #sed命令结束
执行三条命令