1 sed基本介绍
sed命令的格式:
sed [-nefr] ‘/pattern/action’ file-list
举例:
命令:s(替换)
sed ‘s/wust/hanyang/’ file-list
表示对输入文件file-list进行文本wust匹配,如果匹配到就用hanyang进行替换。
选项[-nefr]是可选项,如果用不到也可以没有。
1.1、sed是一种不损伤源文件的编辑器
首先,不同于awk只是搜索,sed工具可以对文本匹配之后进行编辑操作。
但是,sed并不会损伤源文件,因为它只会对缓冲区内的数据进行更改,而更改后的文本直接输出到标准输出上,而不会保存到源文件中。
所以,sed并不会损伤源文件。
虽然可以添加“—i”选项对源文件直接更改,但是最好是先不要使用-i选项,先输出看一下,再添加-i选项。
1.2、sed工具自己处理正则表达式
awk也是自己处理一些字符串正则表达式的匹配。
这个就相当于某些元字符和字符串需要直接提交给sed工具,而不是shell来解析。
即,需要用单引号,将直接提交给sed工具那一部分括起来,防止shell错误解析。
1.3、sed的模式匹配有正则的字符串匹配,还可以是行。两种形式上的区别?
awk工具的pattern部分,也有这两种之分,正则和判别真伪的表达式。
sed的两种和awk工具的两种基本一致,但略有差别。
① 字符串及正则表达式
形式:/string/(两边需要加“//”)
举例:
sed ‘/chen/d’ file-list
表示删除模式匹配到chen字符串的行
② 行
举例:
sed ‘3d’ file-list
表示删除第3行
单单表示行的这种数字,不需要加“\\”符号进行限定。并且不需要像awk工具那样需要进行条件判别:NR==3(NR是awk的一个程序变量)
1.4、sed运用场景
⑴ 对管道的数据做进一步处理
sed流编辑器是一个非常优秀的匹配、替换的工具。
awk和sed除了自己可以接收标准输入、文件等的输入文本外,均可以接收管道传过来的数据。即,awk和sed可以对管道前命令的输出做进一步的处理,输出筛选或处理过的数据。
比如:
nl /etc/passwd | sed ‘2a drink tea’
含义:列出/etc/passwd的内容并打印行号;同时,在第2行下新增一行,添加字符串:drink tea
⑵ 处理大文件
如果有一个100万行的文件,此时你用vi/vim打开并对它进行修改时,你可能会疯掉,此时用sed 是一个明智的选择,它非常适合做大文件的处理。
2 sed的命令
表2.1 sed命令 | |
命令 | 功能 |
s | 替换 |
p | 通常与选项“-n”一起使用,表示只打印匹配行 |
d | 删除 |
g | 与命令s配合使用,表示全部替换 |
a\ | 在匹配行后添加一行或多行 |
i\ | 在匹配行前插入一行或多行 |
c\ | 用新文本替换当前行中的文本 |
r | 从文件中读取输入行 |
w | 将行写入文件 |
q | 结束或退出sed |
y | 按字符替换 |
重点命令讲解:
2.1 替换命令:s
指令格式:sed ‘[address]s/pattern/replacement/flags’ file-list
举例:
sed -n ‘3,5s/str1/str2/p’ file
#对file文件的3—5行的文本内容进行str1匹配,若成功则以str2替换。
说明:
⑴ 选项:-n是取消默认输出;flag:p是打印模式空间的内容。这两个组合使用则只打印匹配成功的行。
⑵ address:3,5 逗号运算符是一个范围运算符,在命令之前出现表示只对这个范围的文本进行模式匹配。
⑶ 替换命令s的flags有哪些:
n:1~512之间的数字,表示对模式空间中指定模式的第n次出现进行替换。如一行中有3个A,而只想替换第二个A。(注意是一行的内容,每读一次新行n随之更新)
g:对模式空间的所有匹配进行全局更改。没有g则只有第一次匹配进行替换。如一行有3个A,若没有flag:g,则仅替换第一个A。
p:打印模式空间的内容。
w file:将模式空间的内容写到文件file中。sed ‘s/^chen/Chen/w file2’ file1
2.2 打印命令:p
指令格式:sed ‘/pattern/p’ file-list
sed ‘n,mp’ file-list
举例:
sed -n ‘3,5p’ file
含义:打印文件的3~5行。
为什么要使用-n选项?
因为不用-n选项的话,会有一个默认输出,即会把所有读入的行,都输出一遍。我们用了p之后,会输出匹配的行。这样,不仅有静默输出的内容还有匹配成功行的内容,混在一起的话不方便观察。
2.3 删除命令:d
指令格式:sed ‘/pattern/d’ file-list(删除模式匹配成功的那一行)
sed ‘n,md’ file(删除文件file的n~m行 )