-
Sed简介
Sed 是面向数据流的行编辑器。流编辑器[1]工作方式如下图,被编辑文本和编辑命令作为输入传到流编辑器,
编辑器根据编辑命令修改文本并输出结果。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
注1:文本编辑器主要分为两类,第一类是我们平时使用的可见即所得的全屏幕编辑器,如 vim,记事本、Word等。全屏幕编辑器一、是可以在文件的任意位置进行编辑,
操作十分简便;二、是所见即所得,可以随时查看编辑结果;以上两种优点使得现有的编辑器几乎都属于这一类。尽管全屏幕编辑器有诸多优点,它也存在一定的缺陷,就是很难使用编程语
言自动处理多个文件。第二类编辑器是行编辑器以及由行编辑器演化而来的流编辑器,Sed 就是属于第二类编辑器。第二类的编辑器的
-
Sed 基本用法:
Sed 命令和其他Linux 命令的用法基本相同,基本格式如下:
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Sed 常用命令:
sed [-n][-e] ‘command‘ file(s)
sed [-n] -f scriptfile file(s)
Command的格式:[address[,address]][!]command
[arguments]
-
红色部分代表命令执行的范围,命令中可以有也可以没有。如果命令中不包含地址,则表示命令执行范围是所有行。
-
地址的具体构成如下:
- ?
??
??
??
??
??
??
?
?
?
?
?
?
?
?
?
?
?
?
?
最后,如果在地址之后加 ! 表示地址范围取反。
例:
---------------------数字标示行------------------------
1:表示第一行
5:表示第五行;
1~2:表示1,3,5,7,9 …… 的数列
$:标示末行
?
?
---------------------正在表达式标示行--------------------
/abc/:包含abc字符串的行
/^[a-b][0-9a-zA-Z]*/:在行首以字母开头数字和字母组成的字符串
\%/[0-9]*/%:包含两条斜线中间是数字的字符串的行
?
?
--------------------逗号分割标示范围行-------------------
1,3:第一行到第三行
2,$:第二行到最后以后
2,/abc/:第二行到首次遇到字符串abc的行
/abc/,14: 首次遇到字符串abc的行到14行
3,+5:第3行之后的5行即3,4,5,6,7,8
/abc/,+3:首次遇到字符串abc的行之后的3行
4,~3:第4行到首次遇到3的倍数行即,4,5,6
/abc/,~3:首次遇到字符串abc的行到之后首次遇到3的倍数行
-------------------地址取反-----------------------
1!:除了第一行之外的所有行
2,5!除了第2行到第5行之外的所有行
/abc/!除了包含abc之外的所有行
?
?
-----------------------------------------------------
?
?
-
Command 表示执行的具体命令
-
????????????????????????????
:::label,标志一个label,用于b/t的跳转
=:[address]= 打印出行号
a:[address]a\ append text to this line.
b:[address[,address]]b[label] 条件分支语句
c:[address[,address]]c\ 替换内容
d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中
D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G:[address[,address]]G 将hold space中的内容append到pattern space\n后
h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H:[address[,address]]H 将pattern space中的内容append到hold space\n后
i:[address]i\ 在address行的前面插入文字,和a反义
l:[address[,address]]l 打印pattern space中的内容,不可打印字符打印出ascii
n:[address[,address]]n 输出pattern space中的内容,读入下一新行替换掉原来的行
N:[address[,address]]N 读入下一行形成multiline pattern,用于跨行处理
p:[address[,address]]p 打印出pattern space中的内容
P:[address[,address]]P 打印出multiline pattern space中的第一行
q:[address]q 碰到address行时退出sed script
r:[address]r file 将文件file的内容append到pattern space后
s:[address[,address]]s/pattern/replace/[flag] 将pattern替换成replace.
????????flag:
????????n:替换第n个出现的pattern,默认是第一个出现的pattern
????????g:全部替换pattern
????????p:如果替换成功则打印
????????w file:将替换的行写入到文件里
t:[address[,address]]t [label] 如果替换成功则跳转
w:[address[,address]]w file 将pattern中的内容追加写到file文件
x:[address[,address]]x 交换hold space和pattern space的内容
y:[address1[,address2]]y/abc/xyz/ 将abc转换为对应的xyz
?
?
例:
?
?
?
?
?
?
?
?