Sed是一种在线编辑器、行编辑器,一次处理一行内容。sed自己也是一个管道命令,能够分享standard input 的,并且sed还能够将数据进行替换、删除、新增、选取特定行等的功能呢。正则表达式
选项介绍bash
sed [-nefr] [动做]编辑器
-n:使用安静模式。在通常sed的用法中,全部来自stdin的数据通常都会列出屏幕上,但若是加上-n参数后,则只有通过sed特殊处理的那一行才会被列出来。ide
-e:直接在命令行模式上进行sed的动做编辑spa
-f:直接将sed的动做写在一个文件内,-f filename 则能够执行filename内的sed动做命令行
-r:sed的动做支持的是扩展正则表达式的语法(默认是基础正则表达式语法)orm
-i:直接修改读取的文件内容,而不是由屏幕输出。ip
动做说明: [n1[,n2]]function字符串
n1,n2:不见得会存在,通常表明选择进行动做的行数,举例来讲,若是个人动做是须要在10到20行之间进行的,则“10,20[动做行为]input
a:新增,a的后面能够接字符串,而这些字符串在新的一行出现(目前的下一行)
c:替换,c后面的能够接字符串,这些字符串能够替换n1,n2之间的行!
d:删除,由于是删除,因此d后面一般不跟任何参数;
i:插入,i的后面能够接字符串,而这些字符串户在新的一行出现(目前的上一行)“
p:打印,也就是将某个选择的数据打印出来,一般p会与参数 sed -n 一块儿运行;
s:替换,能够直接进行替换的工做。一般这个s的动做能够搭配
范例1,将/etc/passwd的内容列出并打印行号,同时,请将第2~5行删除。
[root@localhost ~]# nl /etc/passwd | sed '2,5d'
1root:x:0:0:root:/root:/bin/bash
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
看到了吧?sed的动做为‘2,5d’,那个d就是删除。由于2~5都被删除了,显示的数据就没它们了,另外,本来应该执行sed -e 才对 没有 -e 也行,注意后面sed 格式 ‘ ’。
删除单行就sed ‘#d’ #号表示你删除的第几行,要是从第3行删除到行尾,就sed ‘3,$d'
$表明的是最后一行。
例2.我要在第2行后面加上,hello word,怎么办?
[root@localhost ~]# sed '2a hello word' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hello word
daemon:x:2:2:daemon:/sbin:/sbin/nologin
标准输出给sed,2a就是要在第2行后面添加,hello word,把2a换成2i就表示在第二行的前面添加。
例3 。咱们还能够添加多行在里面。
[root@localhost ~]# nl /etc/passwd | sed '2a sunwukeng\nzhuba\ntangdoudou\nshasha'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
sunwukeng
zhuba
tangdoudou
shasha
要换行就\n;
以行为单位的替换与显示功能
例4.我想将2~5行的内容换成"four to kill"请看下面
[root@localhost ~]# nl /etc/passwd | sed '2,5c four to kill'
1root:x:0:0:root:/root:/bin/bash
four to kill
6sync:x:5:0:sync:/sbin:/bin/sync
看见吗?我来次4杀,2到5 c表示替换,后面的内容,,
例5.咱们还能够打印想要的行,我想要第6行,
[root@localhost ~]# nl /etc/passwd | sed -n '6p'
6sync:x:5:0:sync:/sbin:/bin/sync
这要加-n的,表示安静,不加-n,会打印全文,打印2次6行,,这样你就很闹腾,,
部分数据的查找并替换的功能,、
除了整行的处理模式以外,sed还能够用行为单位进行部分数据的查找并替换功能,基本上sed的查找与替换与vi相相似,它像这样子滴:
sed 's/要被替换的字符/被替换的字符/g'
///或者###或者@@@ s是搜索, g在全文,
例6.取出ip地址,下面我用grep ,sed,
[root@localhost ~]# ifconfig | grep "netmask" | sed 's/^.*inet[[:space:]]*//g' | sed\ 's/[[:alpha:]].*//g'
127.0.0.1
192.168.122.1
找出带有ip地址的行,而后,就sed替换,这都是套路,把不用的统统替换没有,删除,
例7,直接修改文件内容;
你觉得sed只会这样的功能吗?大声说no,sed能够直接修改文件的内容,而没必要使用管道命令或数据流重定向。不过这个操做会直接修改文件,全部要慎重,不要拿系统配置文件搞,
[root@localhost ~]# sed -i 's@^@#&@g' /root/bin/4c.sh
[root@localhost ~]# cat /root/bin/4c.sh
##!/bin/bash
#
#if [ $1 == '--add' ];then
# for I in `echo $2 | sed 's/,/ /g'`;do
# if id $I &> /dev/null;then
# echo "existing"
# else
# useradd $I
# echo "$I" | passwd --stdin $I &> /dev/null
# echo "finished"
# fi
# done
#elif [ $1 == '--del' ];then
# for I in `echo $2 | sed 's/,/ /g'`;do
# if id $I &> /dev/null;then
# userdel -r $I
# echo "deleting completed"
# fi
# done
#else
# echo "-NOT"
#fi
[root@localhost ~]#