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的更多相关文章

  1. 一篇文章学会shell脚本

    一.Shell传递参数 #!/bin/bash # 假设在脚本运行时写了三个参数 ..,,则 "(传递了三个参数). echo "-- \$* 演示 --" for i ...

  2. 【干货】一篇文章学会Gulp(Getting started with Gulp)

    抛开Grunt,又有一个新的自动化构建系统成为新的领跑者.那就是Gulp. Gulp是一种直观.自动化构建的工具. 为什么前端er会这么感兴趣Gulp?我相信大家都有个思想:要么不做事,要做事就要把事 ...

  3. 一篇文章学会springMVC(转)

    说在前面 本文只是入门 为什么用springMVC?springMVC有什么有缺点?springMVC和Struts有什么区别?等等这些问题可以参考网路上资源,本文的重点是快速带入,让大家了解熟悉sp ...

  4. 一篇文章学会spark-streaming

    版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...

  5. 一篇文章学会Docker命令

    目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...

  6. 一篇文章学会Spring4.0

    spring概述 spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是 ...

  7. Wordpress上一篇文章和下一篇文章

    <div class="chapter"> <div class="prev"><?php previous_post_link( ...

  8. UML科普文,一篇文章掌握14种UML图

    前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...

  9. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

随机推荐

  1. kube-proxy源代码分析

    摘要:假设你对kube-proxy的工作原理有一定的了解.本文基于kubernetes v1.5代码对kube-proxy的源代码文件夹结构进行了分析,并以iptables mode为例进行了完整流程 ...

  2. Java之创建对象>5.Avoid creating unnecessary objects

    String s = new String("stringette"); // DON'T DO THIS! The improved version is simply the ...

  3. iOS项目开发实战——学会使用TableView列表控件(四)plist读取与Section显示

    文本将会实现把数据存储到plist文件里.然后在程序中进行读取.在TableView控件中依据不同的类别显示Section. 有关TableView 的其它实现,请參考<iOS项目开发实战--学 ...

  4. Android玩转百度地图Sha1获取正确姿势?

    场景一 由于近期项目钟要用到定位功能因此肯定须要用到地图以及地位功能,相信大家也知道眼下国内比較出名的地图像百度.高德.腾讯等这些还是用到比較多的.于是思考了一下决定还是用百度,相信老司机们都知道的哈 ...

  5. docker 实战---多台物理主机的联网,容器桥接到物理网络拓扑图(四)

    非常多朋友说上一篇中对网络的描写叙述不够清楚,感谢热心的群友彩笔程序猿: 提供了他理解的图,在这里贴一下: 我自己也补画了一副多台机器互联的图,欢迎大家留言讨论: 主机A和主机B的网卡一都连着物理交换 ...

  6. python 模块之platform模块(基本了解)

    # -*- coding: cp936 -*-#python 27#xiaodeng#python 模块之platform模块(基本了解)#获取底层平台的识别数据 #知道该模块用途即可,需要使用时直接 ...

  7. VSTS 免费代码git/tfs托管体验-使用代码云托管

    虽然各种代码托管平台很多.真正免费的私有仓储 却很少.微软的东西还是值得一用.免费版,5个用户.够了. 申请地址: https://www.visualstudio.com/zh-hans/free- ...

  8. ios中base64编码

    参考文章:其中文章的:http://blog.csdn.net/ztp800201/article/details/9470065 下载包 其中 包括GTMBase包下载地址 http://pan.b ...

  9. iOS 10 的一个重要更新-自定义的通知界面

    续上篇,在简单闹钟的例子上,在通知界面上显示图片动画,并用通知关联的按钮更新通知界面.介绍 iOS 10 通知 API 的扩展:自定义通知显示界面. 新框架可以统一处理本地通知和远程推送,同时增加了一 ...

  10. ipsec协议(转)

    from:http://lulu1101.blog.51cto.com/4455468/816875 ipsec协议 2012-03-25 23:40:28 标签:休闲 ipsec协议 职场 IPSe ...