0 前言
自 60 年代末以来,sed 一直是 Unix 标准工具箱的一部分。
Sed在以下三种情况下特别有用:
-
编辑太大的文件,无法进行舒适的交互式编辑;
-
当编辑命令序列过于复杂而无法在交互模式下轻松键入时,可以编辑任何大小的文件。
-
通过输入一次有效地执行多个“全局”编辑功能。
在
Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/141307421?spm=1001.2014.3001.5501
中我们研究了sed了基础知识,现在我们来通过一些实例来见识一下sed删除和替换功能的威力。
1 sed实列
1.1 删除指定行
删除操作使用d命令。
我通过sed对seq命令产生的序列来说明。
关于seq命令的功能和用法,可以参考:Linux shell编程学习笔记35:seq_linux shell seq-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/134938053
1.1.1 删除第3行
[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 3d
1
2
4
5
6
7
[purpleendurer @ bash ~ ]
seq 7 命令执行的结果是产生7行数据,分别是1、2、3、4、5、6、7。
我们把 seq 7 命令执行的结果通过管道传送给命令sed 3d来处理,其中:
3:指定第3行。
d:指定执行删除操作。
于是我们看到处理的结果中,没有第3行。
1.1.2 删除3~5行
我们可以使用
起始行号,结束行号
来指定一个要处理的连续的行块。
要指定对第3行~第5行进行操作,我们可以通过 3,5 来指定。
[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 3,5d
1
2
6
7
[purpleendurer @ bash ~ ]
于是我们看到处理的结果中,没有第3行~第5行。
1.1.3 删除奇数行
我们可以通过
起始行~步长
的格式来指定要处理的行。
对于奇数行,起步行为1,步长为2,所以我们可以使用 1~2 来指定奇数行。
[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 1~2d
2
4
6
[purpleendurer @ bash ~ ]
1.1.4 删除第3行及其后3行
我们也可以可以通过
起始行,+行数
的格式来指定要处理的行,例如我人们要对第3行及其后3行进行处理,那么可以使用 3,+3 来指定。
[purpleendurer @ bash ~ ] seq 8
1
2
3
4
5
6
7
8
[purpleendurer @ bash ~ ] seq 8 | sed 3,+3d
1
2
7
8
[purpleendurer @ bash ~ ]
1.1.5 直接删除纯数字行
我们可以使用正则表达式来指定要处理的行,比如直接删除纯数字行。
[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
222abc
[purpleendurer @ bash ~ ] sed '/^[0-9]*$/d' t.txt
aaa
***
bbb
+++
222abc
[purpleendurer @ bash ~ ]
我们先使用 cat t.txt 命令查看文件t.txt的内容,其第1、4、6行都是纯数字的。
然后我们使用 sed '/^[0-9]*$/d' t.txt 命令将文件t.txt中的纯数字行删除后再输出。
可以看到第1、4、6这由纯数字的3行均被删除了。
而最后一行即第8行,虽然开头是数字222,但后面还字母aaa,不是纯数字行,所以没有被删除。
对命令的第2部分 '/^[0-9]*$/d' 作个说明。:
- /^[0-9]*$/:^代表行开始,$代表行结束,二者之间 的 [0-9]* 代表数字,三者放在一起就代表纯数字行。
- d:代表删除命令
1.2 文本替换
替换操作使用d命令。
整行替换的格式一般为:
sed '[指定操作行]s 替换字符串/' [文件]
如果使用了正则表达式指定要替换的字符串,也就是要进行精准替换,可以用下面这种格式:
sed 's/原字符串/替换字符串/' [文件]
1.2.1 将第3行内容替换为abc
[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed '3c abc'
1
2
abc
4
5
6
7
[purpleendurer @ bash ~ ]
1.2.2 将偶数行替换为abc
对于奇数行,起步行为0,步长为2,所以我们可以使用 0~2 来指定偶数行。
[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed '0~2c abc'
1
abc
3
abc
5
abc
7
[purpleendurer @ bash ~ ]
1.2.3 将每行中的 数字 替换为 -
[purpleendurer @ bash ~ ] echo "0" > t.txt
[purpleendurer @ bash ~ ] echo "aaa" >> t.txt
[purpleendurer @ bash ~ ] echo "***" >> t.txt
[purpleendurer @ bash ~ ] echo "11" >> t.txt
[purpleendurer @ bash ~ ] echo "bbb" >> t.txt
[purpleendurer @ bash ~ ] echo "222" >> t.txt
[purpleendurer @ bash ~ ] echo "+++" >> t.txt
[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
[purpleendurer @ bash ~ ] sed 's/[0-9]/-/g' t.txt
-
aaa
***
--
bbb
---
+++
[purpleendurer @ bash ~ ]
我们先使用echo命令和重定向创建测试文件.txt
然后用cat t.txt 命令查看文件t.txt的内容
最后我们使用 sed 's/[0-9]/-/g' t.txt 命令将文件t.txt中的每行中的 数字 替换为 -再输出。
对命令的第2部分 s/[0-9]*/-/g 作个说明。
- s:替换命令
- /[0-9]*/:正则表达式,代表数字0,1,2,3,4,5,6,7,8,9
- -:要替换的字符串
- /g:全局作用域
1.2.4 将数字替换为空,再删除空行
[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
[purpleendurer @ bash ~ ] sed 's/[0-9]*//g' t.txt
aaa
***
bbb
+++
[purpleendurer @ bash ~ ] sed -e 's/[0-9]*//g; /^$/d' t.txt
aaa
***
bbb
+++
[purpleendurer @ bash ~ ]
我们先使用 cat t.txt 命令查看文件t.txt的内容,其第1、4、6行都是纯数字的。
然后我们使用 sed 's/[0-9]*//g' t.txt 命令将文件t.txt中的每行中的 数字 替换为空再输出。
对命令的第2部分 s/[0-9]*//g 作个说明。
- s:替换命令
- /[0-9]*/:正则表达式,代表数字0,1,2,3,4,5,6,7,8,9
- /g:全局作用域
这里没有指定要替换的目标字符串,也就是替换为空。
最后我们使用 sed -e 's/[0-9]*//g; /^$/d' t.txt 命令将文件t.txt中的每行中的 数字 将数字替换为空,再删除空行。
对命令的第3部分 's/[0-9]*//g; /^$/d' 作个说明。
这个部分由分号分为前后两个命令。
前一个命令 s/[0-9]*//g 在上面已经说明。
后一个命令 /^$/d 包括两个部分:
- /^$/:^代表行开始,$代表行结束,两个符号放在一起,中间没有其他这字符,就代表空行
- d:代表删除命令
1.2.5 将每行第3次出现的2替换为5
[purpleendurer @ bash ~ ] cat -n t.txt
1 0
2 aaa
3 ***
4 11
5 bbb
6 222
7 +++
8 222abc
[purpleendurer @ bash ~ ] cat -n t.txt | sed 's/2/5/3'
1 0
2 aaa
3 ***
4 11
5 bbb
6 225
7 +++
8 225abc
[purpleendurer @ bash ~ ]
我们先使用 cat t.txt 命令查看文件t.txt的内容,其第6、8行都包括3个2。
然后我们使用 cat -n t.txt | sed 's/2/5/3' 命令将文件t.txt中每行第3次出现的2替换为5后再输出。
可以看到第6、8行中的第3个2被替换为5了。
对sed命令后面的 's/2/5/3' 作个说明。:
- s:替换命令
- /2/5/3:其中2是被替换的原字符串,5是被替换的目标字符串,3代表第3次出现。
1.2.6 将每行中第2次出现的a替换为A
[purpleendurer @ bash ~ ] cat -n t.txt
1 0
2 aaa
3 ***
4 11
5 bbb
6 222
7 +++
8 222abc
[purpleendurer @ bash ~ ] cat -n t.txt | sed -e 's/a/A/2'
1 0
2 aAa
3 ***
4 11
5 bbb
6 222
7 +++
8 222abc
[purpleendurer @ bash ~ ]
我们先使用 cat t.txt 命令查看文件t.txt的内容,其中第2行中有3个a。
然后我们使用 cat -n t.txt | sed 's/2/5/3' 命令将文件t.txt中每行中的第2次出现的a替换为A再输出。
可以看到第2行中的第2个a被替换为A了。