目录
1. sed的工作原理
sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。
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"可以不用打印输出未被匹配到的行
p
:打印当前模式空间内容
-n
,
--quiet
,
--silent
:不输出模式空间中的内容,使用安静模式,在一般
sed
的用法中,所有来自
STDIN
的数据一般都会被列出到屏幕上,但如果
加上-n参数
后,则
只有经过sed特殊处理的那一行才会被列出来
#~#: s/pattern/string 以第1行开始,步长为2匹配,将匹配到的那一行的第一个hello替换为hi
#,+N: s/pattern/string/g 第#行及其后面n行,匹配到的每个pattern替换为string
g
:全局替换,默认只替换第一个
#,~N: d命令
addr1,~N
:指定行开始的
N
行;
$: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
匹配到的内容
g
:全局替换,默认只替换第一个
为了方便比较全局替换,对创建的文件改进了以点点
[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