范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

LinuxSed工具解析

  前言
  sed 命令是 Linux 核心命令之一,熟悉 sed 命令可以让程序员在 Linux 环境下更加灵活地处理各种文本,做到事半功倍的效果,甚至再也不用打开文件逐行编辑。
  笔者将个人对 sed 理解加以归纳整理,供大家学习借鉴,如果不当之处欢迎斧正。 基本格式
  首先介绍下 sed 命令的基本格式,万变不离其宗 [address]command
  其中 command   可以有多个,形如[address]{ command command }
  如果 address   为空,可直接省略花括号{}  address
  所谓 address 就是定义将 command[flags] 用在特定行上
  如果 address 为空,则 sed 逐行执行 command  两种寻址方式
  数字方式寻址
  我们可以简单地使用 1,2,3,4   等表示第几行,且$   表示最后一行,比如2   表示选中第二行数据1,3   表示选中 1 ~ 3 行数据,闭区间1,$   表示从第一行到最后一行,闭区间
  文本模式匹配寻址
  从数据内容出发,支持正则匹配找到对应的属性。假设有文本 text1 内容 This is first line This is second line This is third line This is forth line/third/  可以匹配到第三行/f/  可以匹配第一行和第四行/first/,/third/  可以匹配 1 ~ 3 行,闭区间/^This is [a-z]{4} line$/  可以匹配1,3,4  行
  前三个例子是文本模式匹配,最后一个例子是正则匹配,表示匹配 This is 和 line 之间有四个 a-z 组成的字母的行,对正则表达式不清楚的伙伴可以参考我之前发到文章「Linux-正则表达式」,对此做了详细的说明  反向寻址
  在寻址后面加上 !  表明选取这段地址之外的行,比如2,3!  表示选取除了第二行和第三行之外的所有行/first/!   表示选取2,3,4  行commands 替换
  替换命令是最常见之一,使用格式为
  s/pattern/target/[flags]  其中 pattern 支持正则匹配 在 target 使用 &  表示pattern可以对 pattern 进行分组,在target中依次使用 1,2  表示组位置flags 有四个可选项 数字,表明每一行将替换第几处匹配成功的地方 g, 表明新文本将会替换所有匹配的文本 p,表明原先行的内容要打印出来 w file,将替换的结果写入一个文件中
  例如: echo"I have a cat"|sed"s/.at/<&>/"   输出为I have a
  在 posix 规范的正则中,点号  .  表示任意字符,因此 pattern 部分可以匹配到 cat 字符。 在 target 部分中,用 & 表示 pattern 即 cat,因为最终结果为用 替换了 原文中的 catecho"I have a cat"|sed"s/c(.*)/h1/"  输出为I have a hat  pattern:  c(.*)
  target:  h1
  由于 sed 本身仅支持 BRE 规则,如果要使用分组功能,需要给小括号  ()  加上反斜线来转义,括号内部匹配任意字符串,这里分组匹配到了 at。 在 target 部分,使用1  表示第一个分组内容,也就是at,因此 pattern 部分组合起来就是 hat。
  对文本 text1(内容见上文) 做如下操作    root@dnvim   ~/test   sed "s/is/at/" test1 That is first line That is second line That is third line That is forth line
  每行只对第一个 is 替换成了 at    root@dnvim   ~/test   sed "s/is/at/2" test1 This at first line This at second line This at third line This at forth line
  每行对第二个 is 替换成了 at    root@dnvim   ~/test   sed "s/is/at/g" test1 That at first line That at second line That at third line That at forth line
  所有的 is 都替换成 at    root@dnvim   ~/test   sed "s/is/at/gw test.out" test1 That at first line That at second line That at third line That at forth line     root@dnvim   ~/test   cat test.out That at first line That at second line That at third line That at forth line
  将替换结果写入文件 test.out 中
  当然,也可以用上寻址标识,只对特定行数执行替换命令    root@dnvim   ~/test   sed "2s/is/at/g" test1 This is first line That at second line This is third line This is forth line
  只针对第二行,将所有的is 都替换成 at d 删除
  删除命令,相对简单,即将当前行删掉    root@dnvim   ~/test   sed "1d" test1 This is second line This is third line This is forth line
  结合 address  部分内容可知1d  含义是将 第一行删除   root@dnvim   ~/test   sed "/f/d" test1 This is second line This is third line
  /f/d  是将带有 f 的行都删掉   root@dnvim   ~/test   sed "/f/!d" test1 This is first line This is forth line
  /f/!d  这里对地址取反,对于不含有f 的行都删掉i 插入
  插入命令,在指定行的前一行插入数据    root@dnvim   ~/test   sed "2i This is new line" test1 This is first line This is new line This is second line This is third line This is forth line
  这里在第二行之前插入了一个 new line    root@dnvim   ~/test   sed "/f/i This is new line" test1 This is new line This is first line This is second line This is third line This is new line This is forth line
  在所有带有f的行之前,都插入一个 new line a 附加
  与 「插入」命令类似,只是在指定行后插入    root@dnvim   ~/test   sed "2a This is new line" test1 This is first line This is second line This is new line This is third line This is forth line
  在第二行之后插入一个 new line c 修改
  可以理解为替换,用指定数据替换指定的行内容    root@dnvim   ~/test   sed "2c This is new line" test1 This is first line This is new line This is third line This is forth line
  可以看到第二行的内容被替换了 y 转换
  转换命令可以单独修改 一个字符 ,比如   root@dnvim   ~/test   sed "y/Th/ta/" test1 tais is first line tais is second line tais is taird line tais is forta line
  可以将 T 替换成 t , h 替换成 a
  替换的两个参数长度必须严格相等,否则会报错如下所示    root@dnvim   ~/test   sed "y/Th/that/" test1 sed: -e expression #1, char 10: strings for `y" command are different lengthsp/=/l打印
  p 只是原封不动的打印选中的行(专业术语:模式空间)
  = 打印行数
  l (小写的L)打印完成的字符串,包括被转义的字符
  为了演示方便,我们在 sed 命令后加一个 -n 参数,表示关闭自动输出到控制台的能力     root@dnvim   ~/test   sed -n "p" test1 This is first line This is second line This is third line This is forth line     root@dnvim   ~/test   sed -n "=" test1 1 2 3 4     root@dnvim   ~/test   sed -n "l" test1 This is first line$ This is second line$ This is third line$ This is forth line$w 写入
  这里的 写入 是一个 command,需要和下文中 flag 中的写入区分。
  我们可以指定第几行写入到另一个文件中,格式为 [address]w file     root@dnvim   ~/test   sed "2,3w test2" test1 This is first line This is second line This is third line This is forth line     root@dnvim   ~/test   cat test2 This is second line This is third line
  我们将 第二行 和 第三行 内容写入到 test2 文件中 r 读取
  可以理解为,我们从另一个文件中读取内容,并且  append 到指定行之后,格式为[address]r file     root@dnvim   ~/test   cat test3 this is test3 file, line 1 this is test3 file, line 2     root@dnvim   ~/test   sed "$r test3" test1 This is first line This is second line This is third line This is forth line this is test3 file, line 1 this is test3 file, line 2
  我们将文件 test3 的内容  append  到了 test1 文件的最后一行。 这里我们如果不加 address 部分,那么对 test1 文件的每一行都会 append 上 test3 文件的内容   root@dnvim   ~/test   sed "r test3" test1 This is first line this is test3 file, line 1 this is test3 file, line 2 This is second line this is test3 file, line 1 this is test3 file, line 2 This is third line this is test3 file, line 1 this is test3 file, line 2 This is forth line this is test3 file, line 1 this is test3 file, line 2进阶模式空间和保持空间模式空间:(pattern space)是一块活跃的缓冲区,在sed编辑器执行命令时它会保存待检查的文本 保持空间:(hold space) 在处理模式空间中的某些行时,可以用保持空间来临时保存一些行
  sed 执行流程如下图所示: 从第一行开始(或者从 address 定义的地方开始),每读到一行,将该行内容写入模式空间 sed 命令(command 部分) 处理 模式空间中的数据 如果sed 命令 options 中不带有 -n,则将 模式空间 中的数据打印到 console 清空模式空间,并且读取文本文件的下一行内容(或者 address 指定的下一行内容)
  空间操作操作模式空间
  所有的 command 都是针对上述的步骤2
  n 单行next 命令
  告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的最开始再执行一遍,整体流程就好像: (上述步骤3) 如果sed 命令 options 中不带有 -n,则将 模式空间 中的数据打印到 console 将文本文件的下一行替换到模式空间中 执行 command 剩余的命令(如果有)    root@dnvim   ~/test   sed "2{ quote> n quote> s/This/That/ quote> }" test1  This is first line This is second line That is third line This is forth line
  这里用到了多行命令,我们指定寻址文本中的第二行数据,先用 n ,将 sed 移动到下一行,执行  替换 命令
  N 合并文本行
  单行next 命令会将数据流中的下一文本行移动到sed编辑器的工作空间(称为模式空间 )。多行版本的next 命令(用大写N)会将下一文本行添加到模式空间中已有的文本后。
  这样的作用是将数据流中的两个文本行合并到同一个模式空间中。文本行仍然用换行符分隔,但sed编辑器现在会将两行文本当成一行来处理。
  可以理解为将文本内容的下一行附加到了模式空间中
  假设我们有文本文件 test2 如下 On Tuesday, the Linux System Administrator"s group meeting will be held. All System Administrators should attend. Thank you for your attendance.
  我们想要替换 System Administrator 为 Desktop    root@dnvim   ~/test   sed "N; s/System Administrator/Desktop/" test2 On Tuesday, the Linux Desktop"s group meeting will be held. All System Administrators should attend. Thank you for your attendance.
  这里可以用 N 命令将下一行附加到当前行处理,不过需要注意的是,linux 中每个换行出有个    符号
  D 多行删除命令
  多行删除命令D ,它只删除模式空间中的第一行。可以理解 该命令会删除到换行符(含换行符)为止的所有字符。    root@dnvim   ~/test   sed "N; /System Administrator/D" test2 Administrator"s group meeting will be held. All System Administrators should attend. Thank you for your attendance.
  只删了第一行数据(截止到    )
  P 多行打印命令
  多行打印命令(P )沿用了同样的方法。它只打印多行模式空间中的第一行,这包括模式空间中直到换行符为止的所有字符。    root@dnvim   ~/test   sed -n "N; /System Administrator/P" test2 On Tuesday, the Linux System
  这里为了突出 P 命令的功能,我们给 sed 添加 -n 选项,屏蔽常规输出。 操作保持空间h 将模式空间复制到保持空间 H 将模式空间追加到保持空间 g 将保持空间复制到模式空间 G 将保持空间追加到模式空间 x 交换模式空间和保持空间内容
  这些命令用来将文本从模式空间复制到保持空间。这可以清空模式空间来加载其他要处理的字符串。
  通常,在使用h 或H 命令将字符串移动到保持空间后,最终还要用g 、G 或x 命令将保存的字符串移回模式空间(否则,你就不用在一开始考虑保存它们了)。
  由于有两个缓冲区域,弄明白哪行文本在哪个缓冲区域有时会比较麻烦。这里有个简短的例子演示了如何用h 和g 命令来将数据在sed编辑器缓冲空间之间移动。    root@dnvim   ~/test   cat test1 This is first line This is second line This is third line This is forth line    root@dnvim   ~/test   sed -n "/first/ {h ; p ; n ; p ; g ; p }" test1 This is first line This is second line This is first line
  我们来一步一步看上面这个代码例子: sed脚本在地址中用正则表达式来过滤出含有单词first的行; 当含有单词first的行出现时,h 命令将该行放到保持空间; p 命令打印模式空间也就是第一个数据行的内容; n 命令提取数据流中的下一行 (This is second line),并将它放到模式空间; p 命令打印模式空间的内容,现在是第二个数据行; g 命令将保持空间的内容(This is the first data line )放回模式空间,替换当前文本; p 命令打印模式空间的当前内容,现在变回第一个数据行了。
  通过使用保持空间来回移动文本行,你可以强制输出中第一个数据行出现在第二个数据行后面。如果丢掉了第一个p 命令,你可以以相反的顺序输出这两行。    root@dnvim   ~/test   sed -n "/first/ {h ; n ; p ; g ; p }" test1 This is second line This is first line
  这是个有用的开端。你可以用这种方法来创建一个sed脚本将整个文件的文本行反转 流程控制
  流程控制中的 「分支」 和 「测试」 本质上还是一种命令 command  分支
  [address]b[label]
  之前提到过,sed 允许我们传入多个 command,这里再补充下,command 之间可以加一个 label (7 个字符以内),将命令分割开来。对于 b 命令,可以直接跳转到这个 label 位置,不用执行这个 label 之前的命令。    root@dnvim   ~/test   sed "{ 3b jump1 s/T/t/ :jump1 s/ is/ was/}" test1 this was first line this was second line This was third line this was forth line
  如上例, 3bjump1   表示在处理第三行的时候,command 直接跳转到:jump1   位置, 忽略了s/T/t/  这条命令如果 b 命令后没有 label,则这行数据不会执行任何命令(直接跳转到 commands 最后一行)
  同理,如果 commands 中没有 b 后面的指定的 label,那么对应行数据也会得不到处理
  如果 b 命令前不指定 address,意味着每一行都会尝试「跳转」  测试
  测试命令仅仅出现在替换命令中 ,如果替换命令发生替换(即 pattern 成功匹配),则触发跳转   root@dnvim   ~/test   sed "{ s/second/SECOND/ t jump1 s/T/t/ :jump1 s/ is/ was/ }" test1 this was first line This was SECOND line this was third line this was forth line
  如上例, s/second/SECOND/  在第二行发生,触发了「测试跳转」,略过s/T/t/  命令实战案例
  以上是 sed 的全部核心用法,根据上述内容,我们已经具备一些流式数据处理的能力了。比如有文本 tesst2 如下    root@dnvim   ~/test   cat test2 This is first line    This is second line    This is third line     This is forth line
  每行之间有很多空行,看起来非常不美观,我们想删除所有的空行可以怎么这么做    root@dnvim   ~/test   sed "/^$/d" test2 This is first line This is second line This is third line This is forth line
  这里用到了 正则匹配 + 单行删除命令, 用 /^$/  匹配所有空行,然后用 d 命令,将空行删除
  如果我们在每一行后面,只想保留一个空行,可以这么做    root@dnvim   ~/test   sed "/./,/^$/!d" test2 This is first line  This is second line  This is third line  This is forth line
  这里用到的是 正则匹配 + 地址取反 + 单行删除命令, 用 /./,/^$/  匹配「数据+一个空行」,地址取反,不符合这个规则的行,我们全部删除
  这里看到文本末尾还是空行,如果想将末尾的空行删除,可以再加一个命令如下    root@dnvim   ~/test   sed -e "/./,/^$/!d" test2 | sed "$d" This is first line  This is second line  This is third line  This is forth line
  这里接上管道符号,在下一个sed 命令中,删除最后一行空白

用户还车一周被通知车辆有剐蹭,GOFUN平台一年后竟自动扣款收取维修费极目新闻记者黄永进实习生张洁扫了一辆共享汽车回宿舍,还车后一个星期被应用后台通知车漆有剐蹭,马先生对平台提供的照片提出质疑,表示不予缴费并卸载了该软件,没想到一年后竟被平台通过支付科技助力,展现中国式审美来源人民网人民日报一直以来,科技与舞台艺术都有着紧密的联结,在舞台美术方面有着尤为突出的体现。从古希腊罗马剧场中代表了当时最高科技水平的声场设计和半圆形舞台的切割工艺,到电灯的发明美国超一半人ampampquot打零工ampampquot?多家科技巨头最新宣布,这些员工可永久居家办公哪些股票可布局?打工人逐渐变成了打零工人!互联网的普及与各类工具的涌现,使得职员们远程办公逐渐成为趋势,美国科技巨头们已纷纷做出表率,多家公司宣布允许部分职工永久远程办公。在经济下行的冲击下,企业华为智选发布乐奇智能电动滑板车,支持鸿蒙系统,首发2399华为的智选品牌在中国推出了一款全新产品。名字为LEQI智能电动滑板车,拥有一些创新功能以及很酷的设计。它的标价为2399元,目前已上架。这款滑板车的主要功能之一是蓝牙模块和对鸿蒙系AppleWatch7评测一款独立且实用的智能手表凭借更纤薄的边框和更大的显示屏,AppleWatch7是迄今为止最实用的独立智能手表。苹果最新款智能手表AppleWatchSeries7是对Series6的增量升级,保持18小时好赛道,好公司,赶紧上车今天给大家介绍一家跟我们生活息息相关的人工智能公司科大讯飞。科大讯飞长期从事语音及语言自然语言理解机器学习推理及自主学习等人工智能核心技术研究并始终保持国际前沿技术水平,致力于让机冬天告别冰水,TCL推出智能水龙头,3秒速热仅69元冬天已经临近,各地都在降温。刷牙洗脸洗碗洗菜将逐渐变成一种考验,冰冷刺骨的自来水是冬天的噩梦。有条件的家庭用上了热水器的热水,没有这种条件的怎么办呢?换一个速热水龙头即可。TCL就2022年五大技术彰显智慧生活新趋势人间的烟火气千年来始终如一,但技术的发展却日新月异,给人类带来的影响也日益复杂。美国福布斯双周刊杂志网站在近日的报道中,为我们列出了2022年五大技术趋势,包括人工智能(AI)无处美国在行动,韩国会是下一个日本了01hr一边是美国科技巨头苹果打破双11购物节的世界最高销售额纪录,单品牌在双11实现了销售额破百亿的神话纪录风光无限。一边却是韩国科技巨头三星苹果在全球范围内最大的竞争对手却被逼华为将在17日晚举行发布会,Mate50系列要官宣了吗?今天华为官方微博发布了一条消息,称在11月17日1930将举行一场发布会,发布会的主题为全场景智慧生活。据悉在本次发布会中,华为会发布至少三种类型的产品,分别是运动手表系列,平板系高端手机销量洗牌华为排名垫底,小米MIX4第三,苹果包揽冠亚军文Dong审核子扬校对知秋双十一大促的来临,带动了一众消费者们的购买热情。尤其是在电子产品领域,消费者的购买需求更是进一步增加。11月10日,京东方面公布了11月10日京东手机通讯
华为鸿蒙系统支持第三方手机,开源开放毫无保留在华为鸿蒙伙伴峰会上,华为消费者业务AI与智慧全场景业务部副总裁杨海松接受科创板日报等媒体采访时表示,鸿蒙系统完全开源开放,今年会按照既定计划做到128MB4GB的设备全栈系统开源比EUV光刻机更迫切!美国3巨头垄断95市场,华为已开始布局最近大半年来愈演愈烈的芯片危机令全球各国都意识到了芯片的重要性,美国日本韩国相继推出了回归半导体产业的计划。美国计划投资520亿美元扶持本国的半导体制造,韩国计划投资4500亿美元片多多上线,看片免费,但赚钱不易拼多多作为拼购电商的代表,可谓是一战成名。近日,腾讯也上线类似名称的平台片多多,官方简介里称,这款App不仅可以免费看片无广告,还能赚钱。实际体验中,记者发现该APP内容主要以影视华为儿童手表4X新耀款上线,支持微信多重定位,时刻守护儿童这几年,儿童手表在市场上很火,因为儿童手表不仅方便了儿童,也方便了家长。近日华为推出了华为儿童手表4X新耀款,还升级了很多新功能,家长们可以了解一下。华为儿童手表4X新耀款的一大特罗永浩再次有了通往梦想的盘缠,他不问前路,毅然前行最佩服的人就在4月11日,交个朋友直播间CEO黄贺表示,和罗永浩的转让费用目前仍在商议中。随着辛巴,薇娅的让道,李佳琦变成一枝独秀,还有许多主播主动被动的补税,罗永浩抽身而退!罗永带健康养鲜上岛,容声冰箱给蘑菇屋美食增鲜随着向往的生活6的官宣,关于蘑菇屋里的那些美食,越来越多的被人记起,向往的生活6的官微还特意发起了最想推荐的海边美食是什么的话题。而说到美食,就不得不提此次蘑菇屋的新朋友容声冰箱,2年前2799入手的华为荣耀V30Pro8GB256GB还香不香?手机华为荣耀手机实话说当年花了很便宜的价格买了荣耀v30pro,2799元买了8256的。这价格和配置用着实在太香了。为什么还挺香?主要是有以下几点CPU华为麒麟海思旗舰9905G以代谢网络模拟方法揭示健康老化的代谢特征科技日报讯(记者赵汉斌)人口老龄化是我国及全球许多国家面临的日益紧迫的问题。近日,科技日报记者从中国科学院昆明动物研究所获悉,该所研究人员利用新型代谢网络分析方法,发现脂氧化代谢功合其家董事长林昕杨详解物物地图帮助企业数字化转型的三板斧在消费升级的大趋势下,要想让消费者获得更多的体验感与参与感,回归线下是一条无法避免的道路。加上4G网络的普及5G网络的大力发展,以及大数据物联网等硬科技的日益成熟,使得看似缘起于电科技创新,冀往开来透视2021年度河北省科学技术奖科技创新,冀往开来透视2021年度河北省科学技术奖这是一场科技创新的盛宴。4月12日,在2021年度河北省科技奖励大会上,259项(人)获得省科学技术奖。从全新的锆钛基合金到人工智曝台积电3nm今年8月投片,iPhone12让路新机沦为白菜机近日,台积电与三星在3nm工艺上的较量,引起了全球半导体行业的关注,也受到了网友的高度评价。调查报告显示,虽然台积电的3nm制程一度因为开发进度推迟,但台积电的3nm制程最近取得了