linux shell的sed命令用法

文章目录

在上一篇文章里介绍了linux shell的awk命令用法,这是shell中非常实用的一个命令。同时,sed命令在shell的使用中也出现的非常频繁,今天来介绍下linux shellsed命令用法。

sed命令用来对文本进行过滤与替换工作,sed在处理文本文件的时候,会在内存上创建一个模式空间,然后把这个文件的每一行调入模式空间用相应的命令处理,处理完输出;接着处理下一行,直到最后。

sed的基本用法

sed的基本使用方法是

1
sed [选项] 'sed命令' 输入文件

sed选项包括

1
2
3
4
5
6
7
--version        显示sed版本号
--help           显示帮助文档
-n               关闭默认输出,默认将自动打印所有行
-e               直接在命令列模式上进行 sed 的动作编辑
-r               支持扩展正则+ ? () {} |
-i               直接修改读取的文件内容,而不是输出到终端
-f               支持使用脚本

sed命令通常由定位文本行和sed编辑命令两部分组成,sed编辑命令对定位到的行进行各种编辑处理

sed提供两种方式定位文本行:
1、使用行号,指定一行或者行号范围
2、使用正则表达式
sed命令定位文本行的方法有:

1
2
3
4
5
6
7
x	                x为指定行号
x,y	                指定从x到y的行号范围
/pattern/	        查询包含模式的行
/pattern/pattern/	查询包含两个模式的行
/pattern/,x	        从与pattern的匹配行到x号行之间的行
x,/pattern/	        从x号行到与pattern的匹配行之间的行
x,y!	                查询不包含x和y行号的行

sed编辑命令有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
p	打印匹配行
=	打印匹配行号
a	在定位行之后追加文本信息
i	在定位行之前插入文本信息
d	删除定位行
c	用新文本替换定位行
s	使用替换模式替换相应的模式
r	从另一个文件中读文本
w	将文本写入到另一个文件中
y	变换字符
q	第一个模式匹配完成后退出
l	显示与八进制ASCII码等价的控制字符
{}	在定位行执行的命令组
n	读取下一个输入行,用下一个命令处理新的行
h	将模式缓存区的文本复制到保持缓存区
H	将模式缓存区的文本追加到保持缓存区
x	互换模式缓存区和保持缓存区的内容
g	将保持缓存区的内容复制到模式缓存区
G	将保持缓存区的内容追加到模式缓存区

sed的使用示例

1、搜索某行

搜索 /etc/passwd有root关键字的行

1
2
3
4
5
6
7
8
nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....下面忽略

2、删除某行

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

1
2
3
4
5
[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....

只删除第 2 行

1
nl /etc/passwd | sed '2d'

删除/etc/passwd所有包含root的行,其他行输出

1
2
3
4
5
nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....下面忽略
#第一行的匹配root已经删除了

3、增加某行

在第二行后(亦即是加在第三行)加上『drink tea?』字样!

1
2
3
4
5
6
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

若是在第二行前加上『drink tea?』字样!

1
nl /etc/passwd | sed '2i drink tea'

若添加多行用反斜杠『 \ 』间隔每行。

4、替换某行

将第2-5行的内容取代成为『No 2-5 number』呢?

1
2
3
4
5
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

1
2
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
 1  root:x:0:0:root:/root:/bin/blueshell

直接替换字符串

1
sed 's/要被取代的字串/新的字串/g'

5、直接修改文件内容

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

1
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt

sed 的『 -i 』选项可以直接修改文件内容,对于文件的编辑非常有用,在shell脚本中我们也常常使用该功能。



本文出自 TENNFY WU,转载时请注明出处及相应链接。

本文永久链接: http://www.tennfy.com/3039.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

0 + 4 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部