【Linux】三剑客命令之sed命令的常见用法

Linux三剑客指的是grepsedawk这三个命令。其中sed命令的详细用法有很多,但这里只介绍了常见用法。
后续的示例都是在hello.txt的基础上进行的:

[root@bigData01 ~]# cat hello.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
abc

1. 增添数据

  1. 在指定行的下一行增添内容(a参数)

a参数表示在指定行的下一行增添数据,sed后面的参数格式为[address]a\新文本内容(address表示要操作的具体行,是个可选项,不指定行数就会在每一行的后一行都增添内容),例如2a\haha表示在第二行的下一行增添haha字符串。但如果要第一行增添haha字符串却不能写为0a\haha,因为行号是从1开始的,没有第0行,这样就要用的i命令,详见下文。

[root@bigData01 ~]# sed '2a\haha' hello.txt 
Hello world!
Hello world!
haha
Hello world!
Hello world!
Hello world!
Hello world!
abc
[root@bigData01 ~]# sed '1a\haha' hello.txt 
Hello world!
haha
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
abc
[root@bigData01 ~]# sed 'a\haha' hello.txt 
Hello world!
haha
Hello world!
haha
Hello world!
haha
Hello world!
haha
Hello world!
haha
Hello world!
haha
abc
haha
  1. 在指定行的上一行增添内容(i参数)

i参数表示在指定行的上一行增添内容,sed后面的参数格式为[address]i\新文本内容(address表示要操作的具体行,是个可选项,不指定行数就会在每一行的前一行都增添内容),例如1i\haha表示在第一行的前一行增添haha字符串。

[root@bigData01 ~]# sed '1i\haha' hello.txt 
haha
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
abc
  1. 在最后一行增添内容($参数)

$i\haha表示在最后一行的前一行增添haha字符串;$a\haha表示在最后一行的下一行增添haha字符串。

[root@bigData01 ~]# sed '$i\haha' hello.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
haha
abc
[root@bigData01 ~]# sed '$a\haha' hello.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
abc
haha

2. 删除内容

sed后面的参数格式为[address]d(address表示要操作的具体行,是个可选项,不指定行数就会删除全部内容),7d表示删除第七行数据,$d表示删除最后一行数据,因为hello.txt的最后一行是第七行,因此这两行命令的执行结果相同。

[root@bigData01 ~]# sed '7d' hello.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
[root@bigData01 ~]# sed '$d' hello.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

3. 替换内容

  1. 不指定行替换

sed后面的参数格式为[address]s/pattern/replacement/flags,这里的address 表示指定要操作的具体行,是一个可选项。
s表示替换操作,pattern指的是需要替换的旧内容,replacement指的是要替换的新内容,flags有多种用法,我们挑两种说一下
第一种就是flags可以表示为1~512之间的任意一个数字,表示指定要替换的字符串在这一行中出现第几次时才进行替换;
第二种就是flags可以直接表示为g,这样的意思就是对每一行数据中所有匹配到的内容全部进行替换;(如果flags位置的值为空,则只会在第一次匹配成功时做替换操作)

[root@bigData01 ~]# sed 's/l/a/1' hello.txt 
Healo world!
Healo world!
Healo world!
Healo world!
Healo world!
Healo world!
abc
[root@bigData01 ~]# sed 's/l/a/2' hello.txt 
Helao world!
Helao world!
Helao world!
Helao world!
Helao world!
Helao world!
abc
[root@bigData01 ~]# sed 's/l/a/g' hello.txt 
Heaao worad!
Heaao worad!
Heaao worad!
Heaao worad!
Heaao worad!
Heaao worad!
abc
[root@bigData01 ~]# sed 's/l/a/' hello.txt 
Healo world!
Healo world!
Healo world!
Healo world!
Healo world!
Healo world!
abc
  1. 指定行替换

若要指定行替换,只需要在原命令的基础上增添address参数即可。

[root@bigData01 ~]# sed '2s/l/a/2' hello.txt 
Hello world!
Helao world!
Hello world!
Hello world!
Hello world!
Hello world!
abc

4. 保存修改结果到源文件

只需添加-i参数即可。

[root@bigData01 ~]# sed '2s/l/a/2' -i hello.txt 
[root@bigData01 ~]# cat hello.txt 
Hello world!
Helao world!
Hello world!
Hello world!
Hello world!
Hello world!
abc
posted @ 2023-01-15 12:35  ccql  阅读(155)  评论(0编辑  收藏  举报  来源