Linux 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 查看数据(查)

备注:若要查看头几行或尾几行,推荐按使用headtail命令。

打印指定行,第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的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值