Shell 四剑客之 sed d 删除
sed d 替换脚本命令,此命令的基本格式为:
[address]d
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
如果需要删除文本中的特定行,可以用 d 脚本命令,它会删除指定行中的所有内容。但使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除,举个例子:
[root@localhost ~]# cat data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
[root@localhost ~]# sed 'd' data1.txt
#什么也不输出,证明成了空文件
最后一行通常用$d表示,举例如下:
[root@www ~]# cat sed.sh
123
456
789
linux
unix
[root@www ~]# sed '$d' sed.sh --删除最后一行
123
456
789
linux
[root@www ~]# for i in {1..3};do sed -i '$d' sed.sh;done --删除倒数三行
[root@www ~]# cat sed.sh
123
456
[root@www ~]# sed '2,$d' sed.sh --删除第二行到最后一行
123
[root@www ~]# sed '1,$d' sed.sh --删除第一行到最后一行
要删除第 3 到最后一行
nl /etc/passwd | sed '3,$d'
当和指定地址一起使用时,删除命令显然能发挥出大的功用。可以从数据流中删除特定的文本行。
address 的具体写法后续会做详细介绍,这里只给大家举几个简单的例子:
- 通过行号指定,比如删除 data6.txt 文件内容中的第 3 行:
- 或者通过特定行区间指定,比如删除 data6.txt 文件内容中的第 2、3行:
[root@localhost ~]# sed '2,3d' data6.txt This is line number 1. This is line number 4. 将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除! [root@wwww~]# 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 sed 的动作为 ‘2,5d’ ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 ” 两个单引号括住喔!
- 也可以使用两个文本模式来删除某个区间内的行,但这么做时要小心,你指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能,因此,sed 会删除两个指定行之间的所有行(包括指定的行),例如:
[root@localhost ~]#sed '/1/,/3/d' data6.txt #删除第 1~3 行的文本数据 This is line number 4. [root@localhost ~]# cat sed.txt --从匹配到1.14的行一直删除到匹配到1.16的行 192.168.179.1.14 192.168.179.1.15 192.168.179.1.16 192.168.179.1.17 [root@localhost ~]# sed '/1.14/,/1.16/d' sed.txt 192.168.179.1.17
- 或者通过特殊的文件结尾字符,比如删除 data6.txt 文件内容中第 3 行开始的所有的内容:
[root@localhost ~]# sed '3,$d' data6.txt This is line number 1. This is line number 2.
-
高级一点的用法
[root@www ~]# sed '/#/d' /etc/selinux/config --将#所在的行删除,这种是注释未必在第一行
SELINUX=disabled
SELINUXTYPE=targeted
[root@www ~]# sed '/^#/d' /etc/selinux/config --将#开头行删除,注释在第一行
SELINUX=disabled
SELINUXTYPE=targeted
[root@www ~]# cat test.sh
#aaaaaaaaa
#bbbbbbbbb
ccccccc
ddddddd
eeeeeee
fffff
[root@www ~]# sed '/^#/d' test.sh --删除#开头的行
ccccccc
ddddddd
eeeeeee
fffff
[root@www ~]# sed '/^#/d' test.sh | sed '/^$/d' --删除以空开头空结尾的行,^表示开头,$表示结尾(删除注释行和空行)
ccccccc
ddddddd
eeeeeee
Fffff
[root@www ~]# sed -e '/#/d' -e '/^$/d' test.sh
ccccccc
ddddddd
eeeeeee
fffff
[root@www ~]# cat sed.sh
#aaaaaaaaa
#bbbbbbbbb
ccccccc
ddddddd
eeeeeee
fffff
[root@www ~]# sed -e '/^#/d' -e '/^$/d' -e '/#/d' -e '/^ /d' sed.sh --使用-e来连接多条命令处理
ccccccc
ddddddd
eeeeeee
[root@www ~]# sed -e '/#/d' -e '/^$/d' -e '/server/,$d' /usr/local/nginx/conf/nginx.conf --删除server到最后一行,方便配置虚拟主机。(这里的主要目的是使用sed对nginx配置文件进行精简化,方便配置)
user nginx;
worker_processes auto;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
root@www ~]# sed -e '/#/d' -e '/^$/d' -e '/server/,$d' /usr/local/nginx/conf/nginx.conf >>nginx.tmp
[root@www ~]# cat >>nginx.tmp<<EOF --这样就添加上了虚拟主机
> include /usr/local/nginx/conf/vhost/*.conf;
> }
> EOF
或者使用 echo -e "include /usr/local/nginx/conf/vhost/*.conf;/n}" >> nginx.tmp /n代表换行符
在此强调,在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。
目录 返回
首页