Linux 常用命令之 sed

sed 是一种在线编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sed [-nerfi] [acdips]
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,将某个选择的数据输出。通常 p 会与参数 sed -n 一起运行
s :替换 s/old/new/g

删除 2-5

1
2
3
4
5
6
7
8
9
10
11
gax@ubuntu:~$ cat -n /etc/passwd | sed '2,5d'|head
1 root:x:0:0:root:/root:/bin/bash
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
11 uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
12 proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
13 www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
14 backup:x:34:34:backup:/var/backups:/usr/sbin/nologin

删除5到最后一行

1
2
3
4
5
gax@ubuntu:~$ cat -n /etc/passwd | sed '5,$d' |head
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin

在第2行后增加内容

1
2
3
4
5
6
7
8
9
10
11
gax@ubuntu:~$ cat -n /etc/passwd | sed '2a lalall' |head
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
lalall
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin

在第二行前增加内容

1
2
3
4
5
6
7
8
9
10
11
gax@ubuntu:~$ cat -n /etc/passwd | sed '2i lalall' |head
1 root:x:0:0:root:/root:/bin/bash
lalall
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin

增加多行内容,使用 \ 作续行符

1
2
3
4
5
6
7
8
9
10
11
12
gax@ubuntu:~$ cat -n /etc/passwd | sed '2i lalall....\
> enenene'|head
1 root:x:0:0:root:/root:/bin/bash
lalall....
enenene
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin

以行为单位替换内容

1
2
3
4
5
6
7
8
9
10
11
gax@ubuntu:~$ cat -n /etc/passwd | sed '2,3c replace'|head
1 root:x:0:0:root:/root:/bin/bash
replace
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
11 uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

sed 替换格式:sed 's/old/new/g' g 表示全局,不加 g 只替换第一个匹配的字符

1
2
3
4
5
6
7
8
9
10
11
gax@ubuntu:~$ ifconfig | grep 'inet addr'
inet addr:192.168.226.128 Bcast:192.168.226.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
gax@ubuntu:~$ ifconfig | grep 'inet addr' |sed 's/^.*addr://g'
192.168.226.128 Bcast:192.168.226.255 Mask:255.255.255.0
127.0.0.1 Mask:255.0.0.0
gax@ubuntu:~$ ifconfig | grep 'inet addr' |sed 's/^.*addr://g' | sed 's/Bcast.*$'
sed: -e expression #1, char 10: unterminated `s' command
gax@ubuntu:~$ ifconfig | grep 'inet addr' |sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.226.128
127.0.0.1 Mask:255.0.0.0

选项 -i 可以直接修改文件内容,格式内容为: sed -i 's/new/old/g' filename

参考资料

linux sed命令详解

赞赏是对作者最大的支持!
0%