sed 命令

sed(流式编辑器)

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

sed [参数]  '[定位][指令]' 文本路径

指令

p :打印文本
d :删除文本
a   : 在当前行后添加一行或多行内容
c   : 用新文件修改(替换)当前行中的文本
i   : 在当前行之前插入文本
r   :从以外文件中读相关内容,写到相关行之后
w	: 匹配到的行写入一个新的文件之中
y   :将字符转换成一个新的字符
s   : 用一个字符替整体替换成另外一个字符
g   : 全局执行
[root@localhost ~]# sed "s/root/1234/g" /etc/passwd
i   : 配合s指令配合一起使用时,则是忽略大小的作用
[root@localhost ~]# sed "s/ROOT/1234/i" /etc/passwd

\c与c分隔符  : \c与c只是一个代表,其中c可以换成任意一个字符
[root@localhost ~]# sed -i -r "/\/sbin\/nologin/d" 4.txt 

root@localhost ~]# sed -i -r "\#/sbin/nologin#d" 4.txt
[root@localhost ~]# sed -i -r "\A/sbin/nologinAd" 4.txt

参数

-e 允许多项编辑
-n 取消默认输出
-i 就地编辑文本
-r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
-f :指定定位规则的文件

案例 在文本中,打印第一行和第五行

[root@localhost ~]# sed -e '5p' -e "1p" 1.txt 

案例 在文本中,要求只打印第1,5,6三行

[root@localhost ~]# sed -n -e '5p' -e "1p" -e "6p" 1.txt

案例 要求删除文件的第3行

[root@localhost ~]# sed -i '3d' 1.txt 

案例 删除/etc/fstab文件中所有的注释的行

[root@localhost ~]# sed -i -r "/^ *#|^$/d" /etc/fstab 

案例 删除1.txt的3行,打印第4行

[root@localhost ~]# sed -f 3.txt 1.txt 
[root@localhost ~]# cat 3.txt
3d
4p

案例 要求将/etc/passwd文件复制到/root/1.txt中,然后删除当中包含/sbin/nologin的行

[root@localhost ~]# sed -i -r "/\/sbin\/nologin/d" 4.txt 

案例 将/etc/nginx/nginx.conf文件中所有的注释的行(以#开头的行)全部删除

[root@localhost ~]# sed -i -r "/^ *#/d"  /etc/nginx/nginx.conf

(定位)

1、数字

1、固定定位[root@localhost ~]# sed -n '2p' 1.txt 2、范围定位[root@localhost ~]# sed -n '1,3p' 1.txt 

2.正则

正则表达式必须放在/ / 之间

案例

打印/etc/passwd文件中包含root的行[root@localhost ~]# sed -n "/root/p" /etc/passwd将包含空格的行打印出来[root@localhost ~]# sed -n -r "/ +/p" /etc/passwd

3、数字加正则

正则匹配是非贪婪性的匹配贪婪性是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕非贪婪性匹配,一旦匹配到了就停止匹配

案例

1、在/etc/passwd文件中的第一行,到包含test的行,全部删除[root@localhost ~]# sed -r "1,/test/d" /etc/passwd2、删除从包含root的行到第5行的内容[root@localhost ~]# sed -r "/root/,5d" /etc/passwd3、从包含root的行删除到包含ftp的行[root@localhost ~]# sed -r "/root/,/ftp/d" /etc/passwd

案例

练习1:替换/etc/passwd中的root为ROOT[root@localhost ~]# sed "s/root/ROOT/g" /etc/passwd练习2:将模板机(192.168.15.200)中的ip替换成192.168.15.50[root@localhost ~]# sed "s/\.200/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth[01]练习3:删除/etc/passwd中的所有偶数行[root@localhost ~]# sed "1~2d" /etc/passwd练习4:在每一行的行首增加#号[root@localhost ~]# sed "s/^ */#/g" 5.txt练习5:将Hello World替换成World Hello [root@localhost ~]# sed -r "s/(Hello) (World)/\2 \1/g" 6.txt 练习6:将1.txt中的每一行都添加一个.bak的后缀[root@localhost ~]# sed -r "s/(.*)/\1\.bak/g" 1.txt