sed
1. sed命令常见用途
查找关键词做全局替换
查找某行的关键词做替换
查找关键字所在行,并且执行指定关键字的替换
在某行之后追加
查找关键字,并且在第二行追加
删除包含关键字的行
查看指定的行
在最后一行追加
2. 语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
3. 动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
3.1 插入数据(增)
sed -i "${line}a\xxx" ${file} #在第${line}后插入数据
sed -i "${line}a xxx" ${file} #在第${line}后插入数据
sed -i "${line}i\xxx" ${file} #在第${line}前插入数据
sed -i "${line}i xxx" ${file} #在第${line}前插入数据
注:‘a’ 和 ‘i’后面推荐使用’‘反斜杠或者空格’ '。不建议直接跟内容,可读性不高。
3.1.1 文件尾插入
使用echo "xxx" >> file
echo "hello world" >> hello.txt
在最后一行追加一行0 * * * * root /root/check.sh
sed -i "\$a\0 * * * * root /root/check.sh" /etc/crontab
sed -i '$a\0 * * * * root /root/check.sh' /etc/crontab
注意:双引号,’$‘要加转义字符’’。单引号中,就不需要转义。
3.1.2 指定位置插入数据
sed -i '17a\hello world' /etc/crontab # 在第17行插入数据
在/etc/crontab中查找关键字script,并且该关键字的下一行追加一行新内容
sed -i '/^.*script.*$/a\30,45 * * * * root /root/check.sh' /etc/crontab
3.1.3 文件头插入数据
sed -i "2i\hello world" hello.txt # 在第二行前面插入数据
3.2 删除数据(删)
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~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 行
nl /etc/passwd | sed '2d'
要删除第 3 到最后一行
nl /etc/passwd | sed '3,$d'
在/etc/crontab中查找关键字check.sh,并且删除该行
sed -i '/check.sh/d' /etc/crontab
3.3 查找并替换(改)
3.3.1 行替换
将第2-5行的内容取代成为『No 2-5 number』呢?
[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
将5到9行内容替换为 cjk
sed '5,9c\cjk' test
3.3.2 具体内容替换
这里用到的sed命令,选项:
“s”:单独使用–>全局范围下,将每一行的第一处匹配的字符串进行替换==>sed命令
“g”:每一行进行全部替换–>sed命令s的替换标志之一(全局替换),非sed命令。
“-i”:修改文件内容–>sed软件的选项,注意和sed命令i区别。
注:这里不需要用"%s"这种形式,全局用/g即可。
sed -i 's/yes/no/g' hello.txt # /g 代表全局替换,否则只替换每行的第一个'yes'
sed -i '17s/yes/no/g' hello.txt # 在第17行做替换操作
3.4 查看数据(查)
备注:若要查看头几行或尾几行,推荐按使用
head
和tail
命令。
打印指定行,第4行。
sed -n '4p' test
显示第17到18行之间的内容
sed -n '17,18p' /etc/crontab
显示/etc/passwd中包含root的行(不推荐)
sed -n '/root/p ' /etc/passwd #在这种场景,用**grep**的多
3.5 多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
[root@www ~]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1 root:x:0:0:root:/root:/bin/blueshell
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3.6 文件操作
3.6.1 向文件中写入数据
前面已经提到过,可以使用 w 命令向文件写入行。格式如下:
[address]w filename
举个例子:
sed '1,2w test.txt' /etc/passwd
该语句将数据流的第 1、2 行写入文件 test.txt 中去。
3.6.2 从文件中读取数据
可以使用 r 命令来将一个文本中的数据插入到数据流中去,与普通的插入命令 i 类似,这也是对行进行操作的,命令格式如下:
[address]r filename
filename 为要插入的文件。r 命令常结合行寻址使用,以将文本插入到指定的行后面。举个例子:
sed '3 r test.txt' /etc/passwd
这句话将文件 test.txt 中的内容插入到数据流第三行后面去。
3.7 其他
sed 命令处理换行符,例如替换或者删除
sed ':label;N;s/\n/:/;b label' filename
sed ':label;N;s/\n/:/;t label' filename
上面的两条命令可以实现将文件中的所有换行符替换为指定的字串,如命令中的冒号。命令的解释:
:label; 这是一个标签,用来实现跳转处理,名字可以随便取(label),后面的b label就是跳转指令
N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/\n/😕; s是sed的替换命令,将换行符替换为冒号
b label 或者 t label b / t 是sed的跳转命令,跳转到指定的标签处
标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符
加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/\n/😕; s是sed的替换命令,将换行符替换为冒号
b label 或者 t label b / t 是sed的跳转命令,跳转到指定的标签处
标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符