Shell 编程三剑客之Sed(一)

简介: Shell 编程三剑客之Sed(一)

前言

在Linux/UNIX 系统中包含很多种类的文本处理器或文本编辑器,其中包括我们之前学习过的VIM 编辑器与grep 等。而 grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客。


一、Sed工具概述

sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。


sed 的工作流程主要包括读取、执行和显示三个过程。


读取: sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

执行: 默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。

显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。


二、sed 工作原理

2.1.原理图


2. 2.工作原理

读入新的一行内容到缓存空间;


从指定的操作指令中取出第一条指令,判断是否匹配pattern;


如果不匹配,则忽略后读的编辑命令,回到第2步继续取出下一条指令;


如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;


当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;


当所有行都处理完之后,结束;


三、Sed基本语法

通常情况下调用 sed 命令有两种格式,如下所示。其中,“参数”是指操作的目标文件, 当存在多个操作对象时用,文件之间用逗号“,”分隔

scriptfile 表示脚本文件,需要用“-f” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。


sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数

3.1常用选项


常用选项 含义
-e 表示用指定命令或者脚本来处理输入的文本文件,只有一个编辑命令时可省略
-f 表示用指定的脚本文件来处理输入的文本文件
-n 表示仅显示处理后的结果
-i.bak 直接编辑文本文件,不输出结果
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流

3.2常用操作

常用操作 含义
a 增加,在当前行下面增加一行指定内容
c 替换,将选定行替换为指定内容
d 删除,删除选定的行
i 插入,在选定行上面插入一行指定内容
p 打印,输出指定行
s 替换,替换指定字符,格式:“行范围 s/旧字符串/新字符串”
y 字符转换
r 指定读取文件
w 保存为文件

3.3sed用法示例

sed -n 'p' passwd.txt        ##输出所有内容,等同于 cat test.txt
sed -n '3p' passwd.txt      ##输出第 3 行
sed -n '3,5p' passwd.txt  ##输出 3~5 行
sed -n 'p;n' passwd.txt      ##输出所有奇数行,n 表示读入下一行资料
sed -n 'n;p' passwd.txt      ##输出所有偶数行,n 表示读入下一行资料
sed -n '1,5{p;n}' passwd.txt ##输出第 1~5 行之间的奇数行(第 1、3、5 行)
sed -n '10,${n;p}' passwd.txt##输出第 10 行至文件尾之间的偶数行
sed -n '2,+3p' passwd.txt    ##从第2行开始,连续3行进行输出,即输出2~5行


3.3.1Sed结合正则表达式输出指定行

sed 命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。

注:如果遇到特殊符号的情况,扩展正则还需要转义字符“\”。


sed -n '/the/p' test.txt        ##输出包含the 的行
sed -n '2,/the/p' test.txt     ##输出从第 2 行至第一个包含 the 的行
sed -n '/the/=' test.txt        ##输出包含the 的行所在的行号,等号(=)用来输出行号
sed -n '/^PI/p' test.txt     ##输出以PI 开头的行
sed -n '/[0-9]$/p' test.txt     ##输出以数字结尾的行
sed -n '/\<wood\>/p' test.txt   ##输出包含单词wood 的行

新建一个文件进行sed测试




3.3.2结合正则表达式插入符合条件的行

使用插入时,如果添加多行数据,除最后一行外,每行末尾都需要用“\n”符号表示数据未完结,换行。


sed '/the/i 看这里' test.txt    ##在含有the行的前面一行添加看这里
sed '/the/a 看这里' test.txt    ##在含有the行的下一行添加看这里
sed '3a看这里' test.txt         ##在第3行之后插入字符




3.3.3删除符合条件的行

nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。


nl test.txt | sed '3d'       ##删除第3行
nl test.txt | sed '3,5d'     ##删除第3~5行
nl test.txt |sed '/cross/d'  ##删除包含 cross 的行,原本的第 8 行被删除;如果要删除不包含 cross 的行,用!符号表示取反操作, 如'/cross/!d'
sed '/^[a-z]/d' test.txt     ##删除以小写字母开头的行
sed '/\.$/d' test.txt        ##删除以.结尾的行





相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
111 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
52 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
84 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
785 2
|
3月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
56 12