Linux 命令之 sed -- 功能强大的流式文本编辑器

文章目录

  • 一、命令介绍
  • 二、命令格式
  • 三、常用选项
  • 四、sed 子命令
  • 五、sed 替换标记
  • 六、sed 元字符集
  • 七、命令示例
    • (一)用指定的字符串替换掉指定的字符串
    • (二)删除文档中的空白行
    • (三)删除文档中的注释
    • (四)显示文档中除了首行的所有内容
    • (五)查看包含指定字符串的行
    • (六)删除每行行尾的空白字符
    • (七)删除文档中的指定的字符串
    • (八)查看文档中指定行的内容
    • (九)本地修改文件内容
  • 八、参考文献

一、命令介绍

sed 是一种流编辑器,它是文本处理中常用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者使用选项 -i/-Ised 主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

二、命令格式

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

三、常用选项

选项说明
-e<script>--expression=<script>以选项中所指定的 script 来处理输入的文本文件,不写 -e,直接跟着脚本也可以执行
-f<script文件>--file=<script文件>以选项中指定的 script 文件来处理输入的文本文件
-I<扩展名>就地编辑文件,以指定的扩展名保存备份。如果提供零长度扩展名,则不会保存备份。不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下,可能会导致新创建的文件被损坏或内容不完整
-i<扩展名>-I 类似,就地编辑文件,但将每个文件独立于其他文件进行处理。特别是,每个文件中的行号从1开始,$ 地址与当前文件的最后一行匹配,并且地址范围仅限于当前文件。最终结果就像每个文件都由单独的 Sed 实例编辑一样
-h--help显示帮助
-n--quiet--silent仅显示 script 处理后的结果,也就是取消自动打印模式空间。sed 处理文本的时候会把被处理的文本缓存在模式空间中,如果不加这个选项,默认会把模式空间的内容打印出来,就会出现重复的情况
-V--version显示版本信息

四、sed 子命令

命令说明
a\在当前行下面插入文本
i\在当前行上面插入文本
c\把选定的行改为新的文本
d删除,删除选择的行
D删除模板块的第一行
s替换指定字符
h拷贝模板块的内容到内存中的缓冲区
H追加模板块的内容到内存中的缓冲区
g获得内存缓冲区的内容,并替代当前模板块中的文本
G获得内存缓冲区的内容,并追加到当前模板块文本的后面
l列表不能打印字符的清单
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
p打印模板块的行
P大写的 P 打印模板块的第一行
q退出Sed
b lable分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
r file从file中读行
t labelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
T label错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
w file写并追加模板块到file末尾
W file写并追加模板块的第一行到file末尾
!表示后面的命令对所有没有被选定的行发生作用
=打印当前行号码
#把注释扩展到下一个换行符以前

五、sed 替换标记

命令说明
g表示行内全面替换
p表示打印行
w表示把行写入一个文件
x表示互换模板块中的文本和缓冲区中的文本
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1子串匹配标记,引用前面第 1 个小括号的内容。例如,s/\(love\)able/\1rs/s 表示替换的指令,第 1 个双正斜杠 // 之间的内容是被替换的内容,\1 引用前面小括号的内容,也就是 love,所以替换的字符串就是 lovers,于是 loveable 被替换成 lovers
&已匹配字符串标记

六、sed 元字符集

表达式说明
^匹配行开始的位置。例如,/^sed/ 匹配所有以sed开头的行。
$匹配行结束的位置。例如,/sed$/ 匹配所有以sed结尾的行。
.匹配非换行符的任意一个字符,例如,/s.d/ 匹配 s 后面跟着任意一个字符,最后是 d 的字符串。
*表示之前的字符连续出现任意次数(包括 0 次)将会被匹配到。例如,/*sed/ 匹配前面有任意个空格的字符串 sed。
[]表示指定范围内的任意单个字符,例如,/[sS]ed/ 匹配 sed 和 Sed。
[^]表示不在指定范围内的任意单个字符。
&保存搜索字符用来替换其他字符,例如,s/love/ **&**/love 被替换成 **love**
\<匹配单词的开始位置,例如,/\<love/ 匹配以 love 开头的单词。
\>匹配单词的结束位置,例如,/love\>/ 匹配以 love 结尾的单词。
x\{m\}重复字符 x,m次,例如,/0\{5\}/ 匹配 00000
x\{m,\}重复字符 x,至少 m 次,例如,/0\{5,\}/ 匹配 000000000000000000 等。
x\{m,n\}重复字符 x,至少 m 次,最多 n 次。

七、命令示例

(一)用指定的字符串替换掉指定的字符串

如下例子,执行指定替换脚本,这个脚本其实是一个替换指令,结合了正则表达式去匹配目标,然后替换成指定的内容。

将文档 example.txt 中的 “string1” 替换成 “string2”:

sed -e 's/string1/string2/g' example.txt 

注:选项 -e 可以省略掉

用单个零替换多个零,即多个零替换成单个零,即多个零被替换成单个零,即单个零替换掉多个零:

sed -e 's/000*/0/g' example.txt 

注:不是真的把文档中指定的内容替换掉,只是输出到终端的内容是替换之后的内容

(二)删除文档中的空白行

将文档 example.txt 的空白行删除:

sed '/^$/d' example.txt 

注意:不是真的删除文档内容,只是输出到终端显示的内容是删除后的内容,换句话说仅作用于输出的内容。

我这里有个 txt 文件,先看看内容:

[root@htlwk0001host ~]# cat -n test/text.txt1	The tempo of modern civilization has been much quickened in the last twenty years。2	 Whilestring1 witnessingstring1 the dramatic changes in the better-off society,3	  # people begin to reconsider thestring1 question of "survival"。 "Survival" in the old4	 se5	6	nse does not bother us anymore。string1 , we are more concerned about how to7	   #"survive" in the human world full of petition。

我们看到第 5 行是空白行,我们再执行下面这个删除空白行的命令:

[root@htlwk0001host ~]# sed '/^$/d' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。Whilestring1 witnessingstring1 the dramatic changes in the better-off society,# people begin to reconsider thestring1 question of "survival"。 "Survival" in the oldse
nse does not bother us anymore。string1 , we are more concerned about how to#"survive" in the human world full of petition。

我们看到了,空白行已经被删除了,那么实际的文档中是不是真的删除了呢,其实并没有,重复的内容我就不展示了。

(三)删除文档中的注释

删除文档 example.txt 中所有的注释内容和空白行:

sed '/ *#/d; /^$/d' example.txt 

注:*# 可以匹配到文档的所有 #* 表示前面的空格匹配任意个;d 会把含有 # 的行整行删掉;^$ 匹配空白行,匹配到后执行删除指令 d,即把空行删除;分号 ; 表示目录的串行,即前面一个命令执行完后接着执行后面的命令

其实上面这个脚本不够精确,因为把含有 # 的行整行删除显然是极端的,实际应该把 # 到行尾之间的内容删除才合理,所以应该执行下面的脚本:

[root@htlwk0001host ~]# sed 's/^ *#.*$/d' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。Whilestring1 witnessingstring1 the dramatic changes in the better-off society,sense does not bo

(四)显示文档中除了首行的所有内容

sed -e '1d' result.txt 

注:1 表示第 1 行,显然 2 就表示第 2 行,d 把匹配到的行删除。

(五)查看包含指定字符串的行

查看包含字符串 string1 的行:

[root@htlwk0001host ~]# sed -n '/string1/p' test/text.txtWhilestring1 witnessingstring1 the dramatic changes in the better-off society,people begin to reconsider thestring1 question of "survival""Survival" in the oldsense does not bother us anymore。string1 Instead, we are more concerned about how to
[root@htlwk0001host ~]# 

-n 表示取消自动打印模式空间,p 表示打印行,去掉 -n 就会把模式空间的内容也打印出来,如下所示:

[root@htlwk0001host ~]# sed  '/string1/p' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。Whilestring1 witnessingstring1 the dramatic changes in the better-off society,Whilestring1 witnessingstring1 the dramatic changes in the better-off society,people begin to reconsider thestring1 question of "survival""Survival" in the oldpeople begin to reconsider thestring1 question of "survival""Survival" in the oldsense does not bother us anymore。string1 Instead, we are more concerned about how tosense does not bother us anymore。string1 Instead, we are more concerned about how to"survive" in the human world full of petition。

(六)删除每行行尾的空白字符

sed -e 's/ *$//' example.txt 

s 表示替换,* 表示任意数量,* 前面是空格,表示匹配任意个空格,$ 表示行尾的位置,说明是匹配行尾的任意个空白字符(空格),然后替换成第 2 个双正斜杠 // 之间的内容,此内容为空,所以替换后就相当于删除了所有行尾的空格。

(七)删除文档中的指定的字符串

删除文档中所有字符串 string1:

sed -e 's/string1//g' example.txt 

(八)查看文档中指定行的内容

查看文档中从第 1行到第 5 行的内容:

[root@htlwk0001host ~]# sed -n '1,5p;5q' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。Whilestring1 witnessingstring1 the dramatic changes in the better-off society,people begin to reconsider thestring1 question of "survival""Survival" in the oldsense does not bother us anymore。string1 Instead, we are more concerned about how to"survive" in the human world full of petition。

后面这个 5q 是啥意思??

查看第 5 行:

[root@htlwk0001host ~]# sed -n '5p;5q' test/text.txt"survive" in the human world full of petition。

(九)本地修改文件内容

将文件 text2.txt 内的多个 0 替换成 lwx,并且备份原文件,且在原文件扩展名后加上 bk 作为备份文件的扩展名:

[root@htlwk0001host test]# sed  -ibk 's/000*/lwx/g' text2.txt

执行完上述命令后,原文件内容被真实修改了,而且多出一个原文件的备份文件:

[root@htlwk0001host test]# lstext2.txt  text2.txtbk  

八、参考文献

在线工具

AWK程序设计语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flatmap_flatMap()与concatMap()与concatMapEager()– RxJava常见问题解答

flatmapRxJava 2.x中共有三个无缝相似的运算符&#xff1a; flatMap() &#xff0c; concatMap()和concatMapEager() 。 它们都接受相同的参数-从原始流的单个项目到任意类型的&#xff08;子&#xff09;流的函数。 换句话说&#xff0c;如果您有Flowable<T>则可以为任意…

java 中的点_java————形参中的点点点 | 学步园

转自:http://zhidao.baidu.com/question/149668626.htmlmain方法的签名其实可以这样写:public static void main(String... args)//方法1它也可以运行.并且,如果同时还存在public static void main(String[] args)//方法2会报已经存在重复的方法的错误.由此可见,String... args…

sendkeys.send 始终输出英文._PLC的三种输出方式,你知道有哪些吗?

电工技术维修学习网&#xff1a;www.dgjswx.com关注电工技术维修学习网官方微信公众号《电工维修学习》收获更多电工经验知识和提升实战技能电工技术&#xff0c;电气知识&#xff0c;电工基础知识&#xff0c;电工入门知识&#xff0c;电工资料&#xff0c;电工软件&#xff0…

Linux 命令之 echo -- 输出指定的字符串或者变量的值

文章目录一、命令介绍二、命令选项三、命令示例&#xff08;一&#xff09;输出变量的值&#xff08;二&#xff09;合并上下单元格内容&#xff08;三&#xff09;查看一行第一栏&#xff08;四&#xff09;查看一行的第一和第三栏&#xff08;五&#xff09;结合输出重定向符…

java 死循环排查_java应用死循环排查方法或查找程序消耗资源的线程方法(面试)...

今天遇到一个面试&#xff0c;怎么在一堆线程中查找一个死循环&#xff1f;如果遇到线上应用cpu飙升&#xff0c;并出现OutOfMemery怎么办&#xff1f;首先线上应用的jvm配置要养成良好的习惯&#xff0c;增加一下配置则可以在jvm发生 oom的时候自动dump日志了 -XX:HeapDumpOn…

jw摄像_Java命令行界面(第17部分):jw-options

jw摄像JavaWorld的文章“ 用Java处理命令行参数”&#xff1a; Matthias Laux博士关闭的案例介绍了一个简单的基于Java的库&#xff0c;用于处理命令行参数 &#xff0c;我在本文中将其称为jw-options 。 被引用的文章提供了有关为何在构造Options类时做出某些设计决策的背景信…

pixel和毫米怎么换算_压力传感器相关压力单位换算

压力传感器的应用已经很普遍了&#xff0c;压力传感器各个单间之间应该怎么换算呢&#xff0c;这个问题困扰着很多的客户&#xff0c;今天呢我们就来说一下它们之间的换算。在实际的工程应用中&#xff0c;压强单位常被当作压力单位。比较常见的压力单位包括&#xff1a;bar、K…

Linux 命令之 lsof -- 列出当前系统已打开的文件列表

文章目录命令介绍常用选项字段说明文件类型文件描述符文件状态模式锁模式参考示例&#xff08;一&#xff09;查看打开指定文件的所有进程&#xff08;二&#xff09;列出由某个 PID 对应的进程打开的所有文件&#xff08;三&#xff09;查看指定名称的进程所打开的文件列表&am…

mongodb json_在MongoDB和Spring Batch中将XML转换为JSON和原始使用

mongodb json总览 为什么将XML转换为JSON以在MongoDB中原始使用&#xff1f; 由于MongoDB使用JSON文档存储记录&#xff0c;就像表和行将记录存储在关系数据库中一样&#xff0c;我们自然需要将XML转换为JSON。 某些应用程序可能需要存储原始&#xff08;未修改的&#xff09;…

java串口发送16进制数据_MFC串口通信发送16进制数据的方法

本文实例为大家分享了MFC串口通信发送16进制数据的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下MFC串口通信会使用m_mscomm控件。发送数据一般是在edit control 里输入自己想发送的内容&#xff0c;然后点击send button。如果直接发送字符串内容&#xff0c;通过下…

Linux 命令之 du -- 显示每个文件和目录的磁盘使用空间/所占用的磁盘空间大小/所使用的磁盘空间大小/查看文件和目录的大小

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;显示当前目录下的所有子目录和文件所占空间&#xff08;二&#xff09;查看指定文件所占空间的大小&#xff08;三&#xff09;查看指定目录的所占空间&#xff08;四&#xff09;查看多个文件所占空间&#xff08;…

vue 侦听器侦听对象属性_Spring中的异步和事务性事件侦听器

vue 侦听器侦听对象属性内置的事件发布功能从Spring的早期版本开始存在&#xff0c;并且对于处理同一应用程序上下文中Spring组件之间的基本通信仍然有用。 通常&#xff0c;应用程序可以生成应用程序事件&#xff08;可以是任意对象&#xff09;并监听它们。 整个机制非常简单…

mac tomcat java_Mac下配置Java开发环境(JDK1.8)和Tomcat服务器

平时做PHP,装的有nginx,mysql这儿就不多说了&#xff0c;可以看前面的相关文章&#xff0c;用的brew配置的&#xff0c;超简单。 今天介绍一下Java相关的配置 Java官网下载&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 我这儿下载的是Java…

python集合和字典的区别_Python中的字典和集合

导语&#xff1a;本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得&#xff0c;打算入门Python的朋友们可以来一起学习并交流。 本文重点&#xff1a; 1、掌握常见的字典创建&#xff0c;查询&#xff0c;判别方法&#xff1b; 2、了解字典中的defaultdict、…

Linux 命令之 df -- 显示磁盘空间使用情况

文章目录命令介绍常用选项大小格式参考示例&#xff08;一&#xff09;查看系统磁盘设备的使用情况&#xff08;二&#xff09;显示指定文件所在分区的磁盘使用情况&#xff08;三&#xff09;显示文件类型为ext4的磁盘使用情况命令介绍 df 命令的英文全称即“Disk Free”&…

apache ignite_Apache Ignite本机持久性,简要概述

apache ignite通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;就不再需要处理使用传统旋转磁盘引起的问题。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还…

java编程九九乘法表_如何用JAVA语言编写一个九九乘法表

教一下学了JAVA語言的同学们撰写一个99玖玖乘决表方法进行设计构思&#xff1a;假如把99玖玖乘决报表中如“1*11”算式全部当作一个一字的笔画体得话&#xff0c;99玖玖乘决表可当作一个倾斜角二五长方形形&#xff0c;进行倾斜角二五长方形形可用两个for循环系统软件嵌套循环来…

python tkinter 安装_如何为Python安装tkinter?

如果你和我一样&#xff0c;由于你在I.S中的好朋友而在你的网络上没有根目录特权&#xff0c;而且你是在本地安装中工作的&#xff0c;你可能会在上面的方法上遇到一些问题。 我在谷歌上花了很长时间--但最终&#xff0c;这很容易。 要在Linux上本地安装(我将其安装到我的主目录…

Linux 命令之 more -- 显示文本文件内容/显示文件内容/查看文件内容

文章目录一、命令介绍二、常用选项三、命令内部操作快捷键四、参考示例&#xff08;一&#xff09;显示文件file的内容&#xff0c;显示之前先清屏&#xff0c;附已显示的百分比&#xff08;二&#xff09;显示文件file的内容&#xff0c;每10行显示一次&#xff0c;而且在显示…

java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索

java jigsawJava 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;这到底是什么呢&#xff1f; 什么是模块化&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;J…