sed 的特点:
(1) sed 命令是将一系列的编辑命令应用于一批文本的理想工具。
(2) sed 命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。
(3) sed 命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区(最多 8192 节),然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。
2. sed的基本语法
sed OPTIONS… [SCRIPT] [INPUTFILE…]
常用的选项:
-n , --quiet , --silent :不输出模式空间中的内容,使用安静模式,在一般 sed 的用法中,所有来自
STDIN 的数据一般都会被列出到屏幕上,但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行才会被
列出来;
-i :直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;
-e :直接在命令行模式上进行 sed 的动作编辑,多个子命令之间也可以用分号隔开; sed - e
'command1 ; command2... filename 或者 sed - e 'command1' - e 'command2' ……filename
-r :使用扩展正则表达式;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作。
3. 模式空间中的编辑操作
3.1 地址定界
1) # : # 为数字,指定要进行处理操作的行; 1 ,表示第一行;
2) $ :表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;
3) /regexp/ :表示能够被 regexp 匹配到的行;
regexp 即基于正则表达式的匹配;
4 ) /regexp/I :匹配时忽略大小写;
5 ) \%regexp%: 任何能够被 regexp 匹配到的行,换用 % (用其他字符也可以,如: # )为边界符号;
6 ) addr1,addr2 :指定范围内的所有的行(范围选定);
常用地址定界表示方式:
a) 0 , /regexp/ :从起始行开始到第一次能够被 regexp 匹配到的行。
b) /regexp/,/regexp/ :被模式匹配到的行内的所有的行。
7 ) first~step :指定起始的位置及步长,例如: 1~2 表示 1,3,5…
8 ) addr1,+N :指定行以及以后的 N 行;
addr1,~N:将匹配addr1和addr1之后的行,直到输入行号为N的倍数的下一行。
m,~n m<=n时,作用和m,+n一样 m>n时, 匹配m-n行
注意事项:
1、如果没有指定地址,表示命令将应用于每一行
2、如果只有一个地址,表示命令将应用于这个地址匹配的所有行
3、如果指定了由逗号分隔的两个地址,表示命令应用于匹配第一个地址和第二地址之间的行 ( 包括这两行)
4、如果地址后面跟有感叹号,表示命令将应用于不匹配该地址的所有行
3.2 常用编辑命令
1 ) d :删除匹配到的行
2 ) p :打印当前模式空间内容
3 ) a \text : append, 表示在匹配到的行之后追加内容
4 ) i \text : insert, 表示在匹配到的行之前追加内容
5 ) c \text : change, 表示把匹配到的行和给定的文本进行交换
6 ) s/regexp/replacement/flages :查找替换 , 替换 regexp 匹配到的内容(其中 / 可以用其他字符代替, 例如@ )
其他编辑命令:
常用的flages :
g:全局替换,默认只替换第一个
i: 不区分大小写
p:如果成功替换则打印
7 ) r 读入文件内容追加到匹配行后面
8 ) R 读入文件一行内容追加到匹配行后面
9 ) y : y/source/dest/ 固定长度替换,要求替换的字符串长度相等
10 ) w /path/to/somefile :将匹配到的文件内容追加到指定的文件末尾
4. 示例演示
先创建一个演示文件,并用以下编辑命令对其操作
[root@localhost test]# vim test_text
1 hello china 1
2 hello chongqing 2
3 hello shaanxixian 3
4 hello guandong 4
5 hello zhejiang 5
6 fuck japan 6
7 fuck korea 7
#: d命令 删除第#行
i \text命令 -i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;
c \text命令
c \text : change, 表示把匹配到的行和给定的文本进行交换
#,#: p命令 'n,m p '打印n到m行到模式空间并打印输出当前模式空间里的类容,加上"-n"可以不用打印输出未被匹配到的行
-n , --quiet , --silent :不输出模式空间中的内容,使用安静模式,在一般 sed 的用法中,所有来自
STDIN 的数据一般都会被列出到屏幕上,但如果 加上-n参数 后,则 只有经过sed特殊处理的那一行才会被列出来
#~#: s/pattern/string 以第1行开始,步长为2匹配,将匹配到的那一行的第一个hello替换为hi
#,+N: s/pattern/string/g 第#行及其后面n行,匹配到的每个pattern替换为string
#,~N: d命令
$:d命令 删除最后一行
$ :表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;
/regexp/ : a \text
/regexp/:表示能够被regexp匹配到的行;
a \text : append, 表示在匹配到的行之后追加内容
#,/regexp/ : s/pattern/string/g 将第#行和第#行后第一次匹配到regexp的行的pattern替换为string
#,/regexp/:从第#行开始到第一次能够被regexp匹配到的行。
[root@localhost test]# sed '2,/hello/ s/hello/hi/' test_text
hello china 1
hi chongqing 2
hi shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# sed '0,/hello/ s/hello/hi/' test_text
hi china 1
hello chongqing 2
hello shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# sed '3,/hello/ s/hello/hi/' test_text
hello china 1
hello chongqing 2
hi shaanxixian 3
hi guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
[root@localhost test]# vim test_text
[root@localhost test]# sed '2,/hello/ s/hello/hi/' test_text
hello china 1
hi chongqing 2
cccc
hi shaanxixian 3
hello guandong 4
hello zhejiang 5
fuck japan 6
fuck USA 7
/regexp/, /regexp/: s/pattern/string/g
/regexp/,/regexp/ :被模式匹配到的行内的所有的行。
s/regexp/replacement/flages :查找替换 , 替换 regexp 匹配到的内容
为了方便比较全局替换,对创建的文件改进了以点点
[root@localhost test]# more test_text
hello china 1
hello chongqing 2
hello shaanxixian 3
hello guandong 4 hello
hello zhejiang 5
fuck japan 6
fuck USA 7
测试:
game over