【Linux】三剑客命令之sed命令的常见用法
Linux三剑客指的是grep
、sed
、awk
这三个命令。其中sed
命令的详细用法有很多,但这里只介绍了常见用法。
后续的示例都是在hello.txt的基础上进行的:
[root@bigData01 ~]# cat hello.txt
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
abc
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
- 在指定行的上一行增添内容(
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
- 在最后一行增添内容(
$
参数)
$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. 替换内容
- 不指定行替换
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
- 指定行替换
若要指定行替换,只需要在原命令的基础上增添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