个人学习笔记--sed命令(基础篇)

本文详细介绍了SED命令的基础用法及高级技巧,包括文本替换、行寻址、文本插入和删除等功能,帮助读者掌握SED命令在文本处理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[qs@qs ~]$ echo "This is a test" | sed 's/test/big test/'
This is a big test
[qs@qs ~]$ 

-------

[qs@qs ~]$ cat data1 
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[qs@qs ~]$ sed 's/dog/cat/' data1
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
[qs@qs ~]$ 

-------

[qs@qs ~]$ sed -e 's/brown/green/; s/dog/cat/' data1
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
[qs@qs ~]$ 
-e选项,执行多个命令;命令之间必须用分号分隔,并且在命令末尾和分号之间不能有空格。

-------

[qs@qs ~]$ sed -e '
> s/brown/green/
> s/fox/elephant/
> s/dog/cat/' data1(不能换行)
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
[qs@qs ~]$ 
必须记住,要在封尾单引号所在行结束命令。bash shell一旦发现了封尾的单引号,就会执行命令。

-------

[qs@qs ~]$ cat script1 
s/brown/green/
s/fox/elephant/
s/dog/cat/
[qs@qs ~]$ sed -f script1 data1 
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
[qs@qs ~]$ 
如果有大量要处理的sed命令,将它们放进一个文件中通常会更方便一些。可以在sed命令中使用-f选项来指定文件。

-------

[qs@qs ~]$ cat data5
This is a test of the test script.
This is the second test of the test script.
[qs@qs ~]$ sed 's/test/trial/' data5
This is a trial of the test script.
This is the second trial of the test script.
[qs@qs ~]$ 
默认情况下,只替换每一行中出现的第一处。要让替换命令对一行中不同地方出现的文本都起作用,必须使用“替换标记”。

-------

[qs@qs ~]$ sed 's/test/trial/2' data5
This is a test of the trial script.
This is the second test of the trial script.
[qs@qs ~]$ 
第一种替换标记是数字,表明新文本将替换第几处模式匹配的地方。

-------

[qs@qs ~]$ sed 's/test/trial/g' data5
This is a trial of the trial script.
This is the second trial of the trial script.
[qs@qs ~]$ 
第二种替换标记是g,使你能替换文本中每一处匹配模式出现的地方。

-------

[qs@qs ~]$ cat data6
This is a test line.
This is a different line.
[qs@qs ~]$ sed -n 's/test/trial/p' data6
This is a trial line.
[qs@qs ~]$ 
第三种替换标记是p,p替换标记会打印包含与命令中指定的模式匹配的行。通常和-n选项一起使用。

-------

[qs@qs ~]$ sed -n 's/test/trial/w test' data6
[qs@qs ~]$ cat test
This is a trial line.
[qs@qs ~]$ 
第四种替换标记是w,和p替换标记产生同样的输出,不过会将输出保存到指定的文件中。

-------

[qs@qs ~]$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
[qs@qs ~]$ sed 's!/bin/bash!/bin/csh!' /etc/passwd

-------
行寻址之数字方式的行寻址
-------
第一:单个行号
[qs@qs ~]$ sed '2s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[qs@qs ~]$ 

-------
第二:起止行号
[qs@qs ~]$ sed '2,3s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.

[qs@qs ~]$ sed '2,$s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
[qs@qs ~]$ 

-------

行寻址之文本过滤器模式
[qs@qs ~]$ grep qs /etc/passwd
qs:x:500:500:qs:/home/qs:/bin/bash
[qs@qs ~]$ sed '/qs/s/qs/qsmmeng/g' /etc/passwd
……
tcpdump:x:72:72::/:/sbin/nologin
qsmmeng:x:500:500:qsmmeng:/home/qsmmeng:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

------

组合命令
[qs@qs ~]$ sed '2{s/fox/elephant/; s/dog/cat/}' data1
The quick brown fox jumps over the lazy dog.
The quick brown elephant jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[qs@qs ~]$ 
[qs@qs ~]$ sed '2,${s/fox/elephant/; s/dog/cat/}' data1
The quick brown fox jumps over the lazy dog.
The quick brown elephant jumps over the lazy cat.
The quick brown elephant jumps over the lazy cat.
The quick brown elephant jumps over the lazy cat.
[qs@qs ~]$ 

-------
删除命令
-------

[qs@qs ~]$ sed 'd' data1
[qs@qs ~]$ 

[qs@qs ~]$ cat data7
The line is number 1.
The line is number 2.
The line is number 3.
The line is number 4.
[qs@qs ~]$ sed '3d' data7
The line is number 1.
The line is number 2.
The line is number 4.
[qs@qs ~]$ 
[qs@qs ~]$ sed '2,3d' data7
The line is number 1.
The line is number 4.
[qs@qs ~]$ 
[qs@qs ~]$ sed '2,$d' data7
The line is number 1.
[qs@qs ~]$ 
[qs@qs ~]$ sed '/number 1/d' data7
The line is number 2.
The line is number 3.
The line is number 4.
[qs@qs ~]$ 

-------

[qs@qs ~]$ cat data8
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is line number 1 again.
This is test you want to keep.
This is the last line in the file.
[qs@qs ~]$ sed '/1/,/3/d' data8
This is line number 4.
[qs@qs ~]$ 
匹配到1,开始删除,直到匹配到3结束,前三行被删除;
再次匹配到1,开始删除,没匹配到3,一直删除到最后;

[qs@qs ~]$ sed '/1/,/9/d' data8
[qs@qs ~]$ 
始终没有匹配到9,所以就全部删除了。

------

插入和附加文本
[qs@qs ~]$ echo "Test line 2" | sed 'i\Test Line 1' 插入
Test Line 1
Test line 2
[qs@qs ~]$ 
[qs@qs ~]$ echo "Test line 2" | sed 'a\Test Line 3' 追加
Test line 2
Test Line 3
[qs@qs ~]$ 
[qs@qs ~]$ cat data7
The line is number 1.
The line is number 2.
The line is number 3.
The line is number 4.
[qs@qs ~]$ sed '3i\This is an inserted line.' data7 插入到匹配行之前
The line is number 1.
The line is number 2.
This is an inserted line.
The line is number 3.
The line is number 4.
[qs@qs ~]$ 
[qs@qs ~]$ sed '3a\This is an appended line.' data7 追加到匹配行之后
The line is number 1.
The line is number 2.
The line is number 3.
This is an appended line.
The line is number 4.
[qs@qs ~]$ 
[qs@qs ~]$ sed '$a\This is an appended line.' data7 追加到最后一行
The line is number 1.
The line is number 2.
The line is number 3.
The line is number 4.
This is an appended line.
[qs@qs ~]$ 
[qs@qs ~]$ sed '1i\This is one line of new text.\nThis is another line of new text.' data7
This is one line of new text.
This is another line of new text.
The line is number 1.
The line is number 2.
The line is number 3.
The line is number 4.
[qs@qs ~]$ 

-------

修改行
[qs@qs ~]$ sed '3c\This is a changed line of text.' data7
The line is number 1.
The line is number 2.
This is a changed line of text.
The line is number 4.
[qs@qs ~]$ sed '/number 3/c\This is a changed line of text.' data7
The line is number 1.
The line is number 2.
This is a changed line of text.
The line is number 4.
[qs@qs ~]$ sed '2,3c\This is a changed line of text.' data7
The line is number 1.
This is a changed line of text.
The line is number 4.
[qs@qs ~]$ 

-------

转换命令(要求一一对应,否则出错)
[qs@qs ~]$ sed 'y/123/789/' data7
The line is number 7.
The line is number 8.
The line is number 9.
The line is number 4.
[qs@qs ~]$ 
[qs@qs ~]$ echo "This 1 is a test of 1 try" | sed 'y/123/456/' 转换命令是一个全局命令
This 4 is a test of 4 try
[qs@qs ~]$ 

------

打印命令
[qs@qs ~]$ echo "This is a test" | sed 'p'
This is a test
This is a test
[qs@qs ~]$ 

[qs@qs ~]$ sed -n '/number 3/p' data7
The line is number 3.
[qs@qs ~]$ 

[qs@qs ~]$ sed -n '2,3p' data7
The line is number 2.
The line is number 3.
[qs@qs ~]$ 

在修改之前查看一下
[qs@qs ~]$ sed -n '/3/{
> p
> s/line/test/p
> }' data7
The line is number 3.
The test is number 3.
[qs@qs ~]$ 

-------

打印行号
[qs@qs ~]$ sed '=' data1
1
The quick brown fox jumps over the lazy dog.
2
The quick brown fox jumps over the lazy dog.
3
The quick brown fox jumps over the lazy dog.
4
The quick brown fox jumps over the lazy dog.
[qs@qs ~]$ 

[qs@qs ~]$ sed -n '/number 4/{
> =
> p
> }' data7
4
The line is number 4.
[qs@qs ~]$ 

-------

从文件读取数据
[qs@qs ~]$ cat data12
This is an added line.
This is the second added line.
[qs@qs ~]$ sed '3r data12' data7
The line is number 1.
The line is number 2.
The line is number 3.
This is an added line.
This is the second added line.
The line is number 4.
[qs@qs ~]$ 

[qs@qs ~]$ sed '/number 2/r data12' data7
The line is number 1.
The line is number 2.
This is an added line.
This is the second added line.
The line is number 3.
The line is number 4.
[qs@qs ~]$ 

[qs@qs ~]$ sed '$r data12' data7
The line is number 1.
The line is number 2.
The line is number 3.
The line is number 4.
This is an added line.
This is the second added line.
[qs@qs ~]$ 

读取命令的另一个很好的用途是,将它和删除命令一起使用来用另一个文件中的数据替换文件中的占位文本。
[qs@qs ~]$ cat letter 
Would the following people:
LIST
please report to the office.
[qs@qs ~]$ cat data11
Blum, Katie Chicago, IL
Mullen, Riley   West Lafayette, IN
Snell, Haley    Ft. Wayne, IN
Woenker, Mattew Springfield, IL
Wisecarver, Ema Grant Park, IL
[qs@qs ~]$ sed '/LIST/{
> r data11
> d
> }' letter
Would the following people:
Blum, Katie Chicago, IL
Mullen, Riley   West Lafayette, IN
Snell, Haley    Ft. Wayne, IN
Woenker, Mattew Springfield, IL
Wisecarver, Ema Grant Park, IL
please report to the office.
[qs@qs ~]$ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杂货铺的小掌柜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值