一篇文章学会shell工具篇之sed
sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签
1.首先先来了解一下什么是sed?
sed叫做流编辑器,在shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换成为另一种格式输出。下面我们通过一张原理图来了解一下它的工作模式:
编辑命令的格式为,sed /pattern/action
经过sed处理后文件内容并没有改变,除⾮使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;sed默认按照Basic 规范基本匹配!也就是说类似于( ) { } | 等特殊字符需转义,否则就不识别,或者是用扩展模式也可以。
2. 下面重点介绍一下有关sed的参数及action的操作方法
(1)-n参数,p命令的action
(2) d命令的action
(3)/pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
/pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
这个操作不知道大家会不会联想到vim编辑器中的底行模式搜索,它们是类似的。
下面总结一下sed中参数的选择及执行操作:
[plain] view plain copy
<strong>参数选择:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。
-i:将修改结果直接写入到读取数据的文件,而不是由屏幕输出。(1.修改了文件; 2.由cat可查看)
-f: 指定sed脚本的文件名。
action:
a:追加,在当前行后添加一行或多行。
c:行替换,用c后面的字符串替换原数据行。
i:插入,在当前行前插入一行或多行。
p:打印,输出指定的行。
s:字符串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字符串/新字符串/g”(如果不加g的话,则表示只替换每行第一个匹配的串)。
</strong>
以上没有练习到的,有兴趣的可以去尝试尝试!
3.再来介绍一下sed中的定址
定址用于决定对文件中哪些行进行行编辑,地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。下面举一些例子:
sed '/start/ ,/end/d' file #删除包含’start’行和’end’行之间的行
sed '/start/, 10d' file #删除包含’start’ 的行到第十行的内容
4.模式空间和保持空间
(1)保持空间:用来存储数据,相当于一个仓库,它不能对数据进行处理 ;
(2)模式空间:专门以行为单位对数据进行处理。
一般情况下,如果不显示的使用一些选项的话,是不会用到保持空间的。
[plain] view plain copy
<span style="color:#000000;"><strong>命令:
g:将保持空间的内容拷贝到模式空间中,会将模式空间原来的值覆盖掉。
G:将保持空间的内容追加到模式空间中。
h:将模式空间的值拷贝到保持空间,会将保持空间原来的值覆盖掉。
H:将模式空间的值追加到保持空间中。
d:删除模式空间的所有行,并读下一行到模式空间。
D:删除模式空间的第一行,不读下一行到模式空间。
n:输出模式空间的行,读取下一行替换当前模式空间的行,接着执行下一条处理命令而不是第一条命令。
N:读入下一行,追加到模式空间行后面,此时模式空间中有两行。
x:交换模式空间和保持空间的内容。
</strong></span>
例1:给每行后面添加一行空行
例2:用sed模拟倒序(tac)打印的过程
例3.追加匹配行到文件末尾
例4:将一列内容变为一行
例5:求出1-100的求和
例6:打印输出奇数行和偶数行
5.使用标签
[plain] view plain copy
:a表示标签a;
ba表示跳转到a标签;
$表示最后一行;
!表示不做后续操作
所以,$!ba表示最后一行不用跳转到a标签,结束此次操作。
下面举一个例子:
最后补充一点:
[plain] view plain copy
与grep一样,sed也支持特殊元字符来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线"/"之间的模式。
如果要把正则表达式分隔符"/"改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。例如:sed -n 'o^56op' datafile
^:行首定位符 /^my/ 匹配所有以my开头的行;
$:行尾定位符 /my$/ 匹配所有以my结尾的行;
.:匹配除换行符以外的单个字符 /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行;
*:匹配零个或多个前导字符 /test*/ 匹配包含字符串 tes,后跟零个或多个 t 字母的行;
[]:匹配指定字符组内的任一字符 /t[eE]st/ 匹配包含test 或 tEst 的行;
[^]:匹配不在指定字符组内的任一字符 /t[^eE]st/ 匹配string 以t开头,但st之前的那个字符不是e或E的行;
&:保存查找串以便在替换串中引用 s/test/*&*/g 符号&代表查找串。test将被替换为*test*
<:词⾸首定位符 /<my/ 匹配包含以my开头的单词的行;
>:词尾定位符 /my>/ 匹配包含以my结尾的单词的行;
x{m}:连续m个x 如:/9{5}/ 匹配包含连续5个9的行;
x{m,}:至少m个x 如:/9{5,}/ 匹配包含至少连续5个9的行;
x{m,n}:至少m个,但不超过n个x 如:/9{5,7}/ 匹配包含连续5到7个9的行。 还有一个单元匹配--替换的问题:
一篇文章学会shell工具篇之sed的更多相关文章
- 一篇文章学会shell脚本
一.Shell传递参数 #!/bin/bash # 假设在脚本运行时写了三个参数 ..,,则 "(传递了三个参数). echo "-- \$* 演示 --" for i ...
- 【干货】一篇文章学会Gulp(Getting started with Gulp)
抛开Grunt,又有一个新的自动化构建系统成为新的领跑者.那就是Gulp. Gulp是一种直观.自动化构建的工具. 为什么前端er会这么感兴趣Gulp?我相信大家都有个思想:要么不做事,要做事就要把事 ...
- 一篇文章学会springMVC(转)
说在前面 本文只是入门 为什么用springMVC?springMVC有什么有缺点?springMVC和Struts有什么区别?等等这些问题可以参考网路上资源,本文的重点是快速带入,让大家了解熟悉sp ...
- 一篇文章学会spark-streaming
版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...
- 一篇文章学会Docker命令
目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...
- 一篇文章学会Spring4.0
spring概述 spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是 ...
- Wordpress上一篇文章和下一篇文章
<div class="chapter"> <div class="prev"><?php previous_post_link( ...
- UML科普文,一篇文章掌握14种UML图
前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...
- 两个有用的shell工具总结
shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...
随机推荐
- 实现一个简单的shared_ptr
翻看以前的代码的时候发现一个shared_ptr的简单实现. 我记得是网上的一篇例子(好像改了一点),但是又懒得找出处了 ╮(╯▽╰)╭. 觉得这份代码足以用来初步了解shared_ptr的实现了. ...
- 〖Linux〗Shell十进制数值转换十六进制
dec2hex(){ printf } a=$(dec2hex ) echo $a
- V-rep学习笔记:机器人逆运动学解算
IK groups and IK elements VREP中使用IK groups和IK elements来进行正/逆运动学计算,一个IK group可以包含一个或者多个IK elements: I ...
- Fix: Windows Script Host access is disabled on this machine
If you receive this Windows Script Host access is disabled on this machine, Contact your administrat ...
- -webkit-line-clamp下多行文字溢出点点点...显示实例页面
overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box ...
- android 用代码画虚线边框背景
1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_ ...
- BigDecimal去除末尾多余的0
Java有自带的 stripTrailingZeros() 方法用于去除末尾多余的0 BigDecimal num = new BigDecimal("100.000"); Big ...
- 自己开发Visual studio插件-一个nvelocity高亮插件
首先,有一个项目用到了nvelocity模板引擎,但是用vs开发模板的时候,没有高亮效果,所以非常不方便,鉴于这个,于是有了自己开发插件的念头,但是在vs sdk开发上面,这方面的资料真是少之又少,网 ...
- Guice与Spring框架的区别
2007-4-23 再借斧子的例子说一说spring与guice的区别 看下边对于不同社会形态下一个人(java对象,调用者)需要一把斧子(java对象,被调用者)的例子: (1),原始社会 ...
- 内存问题排查工具 --- valgrind
1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 4.1. 示例代码 4.2. Valgri ...