sed是什么?
sed是一种流编辑器。流编辑器是用来对输入流进行基本的文本转换(从一个管道文件或输入)。
sed工作原理
- 脚本中所有的编辑命令都将依次应用于每个输入行;
- 命令应用于所有的行,除非寻址限制了受编辑命令影响的行;
- 原始的输入文件未被改变,编辑命令修改了原始行的备份(模式空间),并且将此备份发送到了标准输出.
sed命令
sed [-参数] '指令' 文本
参数 sed [参数] '指令' 文本 |
|||
-e | 执行多个指令 | 只有给出多个指令的时候才需要-e,当只有一个指令的时候,sed可以自己决定 |
sed -e 's/was/WAS/' -e 's/he/they/' file 除了-e之外,使用多个指令的多种方法
|
-f | 指定脚本名称 | 将sed指令写在文件中,-f filename,直接跟文件名称 | sed -f sedscr file |
-n | 阻止输入行的自动显示 | 阻止输入行的自动显示,若想输出时,每个要生成输出的指令,都必须包含打印命令p |
sed -n -f sedscr sed_1.txt
或者
sed -nf sedscr sed_1.txt
|
指令 [address] 指令/pattern/replacement/flags flags修饰标识 n,1-512之间的一个数字,表示第n次匹配的时候 p,打印,于-n参数一起使用 g,对模式空间的情况进行全局修改,不出现该修饰标识表示只有第一次出现的情况 w,将模式空间的内容写到文件中 |
|||
s | 替换 | 用一个字符窜替换另一个字符串 | sed 's/love/lover/g' sed.txt |
d | 删除(模式空间的内容) | 如果某行匹配给定的地址,则删除该行,而不是只删除匹配内容 |
sed 10,$d sed.txt 删除10到最后一行 sed 4d sed.txt 删除第5行 |
D | 删除(多行模式空间) | 只删除多行模式空间的第一行 | |
a | 追加 |
追加[line-address]a
text1
text2
|
|
i | 插入 | 插入[line-address]i
text1
text2
|
|
c | 更改 | 更改[address]c
text1
text2
|
|
n | 下一步next | 打印模式空间中内容,并读取输入的下一行,但是脚本并不会返回脚本顶部 |
/^H1/{ 匹配任何以H1开头的任何行 n 若匹配到了,打印模式空间的内容,并读取下一行,此时脚本并不会返回顶部,而是继续向下执行 /^$/d 删除空行 } |
N | 下一步(多行模式空间) | 读取新的输入行,并将其添加到模式空间的现有内容后面(模式空间内最初的内容和新的内容之间用换行符分割) | |
p | 打印 | 输出模式空间的内容,它既不清楚模式空间的内容, 也不改变脚本的控制流(可以用于脚本调试) | |
P | y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ | ||
y | 转换 | 这个指令影响整个模式空间的所有内容 | |
r | 读 | 用于直接处理文件,后面直接跟文件名 | |
w | 写 | 用于直接处理文件,后面直接跟文件名 |
SED寻址
- 如果没有指定地址,sed会将命令应用于每个输入行
- 每个地址都是一个描述模式,行号或者寻址符号的正则表达式
- 举例说明
如果没有指定地址,命令将用于每一行 | sed 's/love/lover/g' sed.txt |
如果指定一个地址,命令将用于这个地址匹配的任意行 | sed /^May/s/love/lover/g' sed.txt |
如果指定了由逗号隔开的多个地址,命令将用于匹配第一个地址匹配的任意行之后,继续用于第二个地址匹配的任意行... | sed '/^then/,/^May/s/love/lover/g' sed.txt |
如果地址后面跟有!,命令用于不匹配该地址的任意行 |
sed '/^May/!s/love/lover/g' sed.txt
|