sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。

sed不只支持正則表達式。它另一些比較厉害的功能。

我给出一个样例,大家看看有什么办法能够解决它吧。

<html><head><title>Hello World</title>
<body>Welcome to the world of regexp!</body></html>
Hello World
Welcome to the world of regexp!

上面这个HTML文件中的内容怎么通过sed将它变成以下的没有<>的内容呢?我预计在座的非常少有人可以非常快的将它搞定吧,这是我遇到的一个题目,弄了半小时才搞定的。

我用到了sed,先将解题思路给出来解解馋吧^_^

上面的知识一个样例而已,以下要開始介绍sed这款工具的使用了。

首先sed的运行方式有两种:

1. sed option 'script' file1 file2 ...

2. sed option -f scriptfile file1 file2 ...

能够看到sed支持对多个文件操作,事实上它是一行一行的解析的,就像流水一样,知道运行到文件末尾。它的编辑命令

为: /pattem/action  当中pattern是正則表達式,action是编辑操作,以下就介绍一下它的简单使用吧。

1. /pattern/p :打印匹配pattern的行

注意sed默认的是将待处理的已经处理好的都打印出来,所以上面的结果会反复打印匹配的,所以此时我们须要

使用 '-n' 选项来打印我们感兴趣的部分。

2. /pattern/d :删除匹配pattern的行

  

      须要注意的是虽说 'd' 是删除匹配的行,可是它并没有删除文件中面的内容。由于在sed中想要使改动生效,我们

须要用 '-i' 选项。

3. /pattern/s/pattern1/pattern2/     :查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
4. /pattern/s/pattern1/pattern2/g   :查找符合pattern的行,将该行全部匹配pattern1的字符串替换为pattern2

须要注意最后有 'g' 与无的时候的差别,一个字符对整个的影响事实上非常大。

5. sed -i  : 做的操作会改动原文件

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

 这个參数的使用要注意。它真的会使改动生效的。想一想已经写好的project,想看看替换一些小地方后的样子,却又不小心

写错了,结果将整个project的重要代码给替换了,最后想进入project按 ‘U’还原(此时按U还原是无效的),此时你真的有剁手的冲动。

 6.定址

定址用于决定对哪些行进行编辑。地址的形式能够是数字、正則表達式、或二者的结合。假设没有指定地址,sed将处理输入文件的全部行。

可是定址也有好几种情况:

上述这样的情况是按行来定位的,能够打印或删除某一行或者多行,用起来比較简单,比如 sed '1,3d' file ,

sed -n '3p' file , sed -n '2,5p' file 等等。可是以下的情况却是比較复杂的:

当中:

1. sed '/pattem1/,/pantem2/d'  :删除全部包括'pattem1' 和 'pattem2' 的行,以及在他们之间的行,从上

述样例中能够看出吧。

2. sde '/patten1/,nd'  : 删除包括 'pattem1' 的行到第 n 行的内容

以上两点大家须要自己下去多多尝试一下,由于它却是不易理解。

7.正則表達式

一開始就说sed支持正則表達式,可是却没实用到,嘿嘿。以下就来使用一下吧。

(1). '^' ,'$'

(2).
'.' ,'*'

(3) . '\<' 。'\>'

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

以下的两种使用方法比較特殊。是sed的特殊功能

上面的语句中是将test保存起来了记为标签1,以后能够使用 '\1' 来引用它。

看的不是非常清楚的话,以下的样例

会让你明确:

&:保存查找串以便在替换串中引用:s/[0-9]/*&*/g 符号&代表查找串。这个还是自己去试一试,这样你才会

更加的熟悉使用方法,以下另一个样例帮助理解。

以上就是sed的基本使用方法,sed事实上支持非常多命令和一些选项,比如:

命令:
a\ :在当前⾏行后加入一行或多行。多行时除最后一行外。每行末尾需用“\”续行
c\ :用此符号后的新文本替换当前行中的文本。

多行时除最后一行外,每行末尾需用”\"续行

i\ :在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\"续行d删除行
h : 把模式空间里的内容拷贝到暂存缓冲区(保持空间)
H :把模式空间里的内容追加到暂存缓冲区(保持空间)
g :把暂存缓冲区里的内容拷贝到模式空间,覆盖原有的内容
G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l :列出非打印字符
p :打印行
n :读入下一输入行,并从下一条命令而不是第一条命令開始对其的处理
q :结束或退出sed
r :从文件里读取输入行
! :对所选行以外的全部行应用命令
s :用一个字符串替换还有一个
g :在行内进行全局替换
w :将所选的行写入文件
x :交换暂存缓冲区与模式空间的内容
y :将字符替换为还有一字符(不能对正則表達式使用y命令)
选项:
-e :进行多项编辑。即对输入行应用多条sed命令时使用
-n :取消默认的输出
-f :指定sed脚本的文件名称

这些选项我并没有一一解说,常常须要使用它的人就再去好好钻研吧。

至于sed一些高级使用方法,比如在sed中有

"模式空间"和"状态空间"的概念,应该去了解一下,上面给的命令中一些就是针对这两种空间来操作的,我如今还没

有研究好,所以就没写出来,望谅解。

shell脚本学习笔记 (流编辑器sed)的更多相关文章

  1. shell脚本学习笔记(符号)

    shell脚本的学习: 1.Shell的作用是解释运行用户的命令,用户输入一条命令,Shell就解释运行一条,这样的方式称为交互式(Interactive),Shell还有 一种运行命令的方式称为批处 ...

  2. Shell脚本学习笔记之(自动填充函数模板)

    其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...

  3. shell脚本学习(3)sed替换

    1 sed 替换   1格式: 's/原字符串/新字符串/'   输入源   2正确参考: sed ’s/as/AS/' do.txt 改变字符串as为AS,不会改输入源的文件. 匹配每行第一次匹配的 ...

  4. shell脚本学习笔记

    1.判断符号:中括号[ ] [ ]进行数据的判断,例如我想知道HOME这个变量是否为空,[ -z "$HOME" ],或者两个字符串是否相等,[ "$HOME" ...

  5. shell脚本学习笔记 (正則表達式)

    正則表達式一般有三个部分组成,他们各自是:字符类,数量限定符,位置限定符. 规定一些特殊语法表示字符类.数 量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正則表達式(Regu ...

  6. linux shell脚本学习笔记一

    一.文件比较运算符-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]-d filename 如果 filename为目录,则为真 [ -d /tm ...

  7. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  8. Shell 基础 -- 流编辑器 sed 详解

    一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...

  9. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

随机推荐

  1. Django使用js,css等静态文件的时候,出现mime类型问题

    使用adminLTE模板, return render(request, 'AdminLTE/index.html') 的时候报如下错误且页面渲染异常,css没有效果: Resource interp ...

  2. hihocoder #1415 : 后缀数组三·重复旋律3

    #1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  3. 倒计时 服务器时间 .NET js javascript

    原文发布时间为:2011-02-07 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  4. Something about the microsoft HttpContext domain design

    1. HttpContext.Current.Request, Response 2.HttpHandler-> ProcessRequest 3.HttpModule-> Init, I ...

  5. C语言中的基础知识变量探讨

    C语言中的变量是编程的基础,主要有四个要素:存储类型.存储大小.存储名称和存储地址. 一.变量的要素: 1.存储类型:主要表明名变量存储的特征,主要有auto.extern.static和regist ...

  6. 《手把手教你学C语言》学习笔记(10)--- 程序的循环控制

    C语言程序设计中,有些代码需要重复执行很多次,循环主要有三类: 一.for循环 1.基本格式为:for(表达式1:表达式2:表达式3){ //表达式1:循环变量赋初值 //表达式2:循环变量满足的条件 ...

  7. c# Thread类

    现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程. 建议使用线程的同步手段有:  Mutex.ManualResetEvent.Aut ...

  8. Cryptography I 学习笔记 --- 基于陷门置换的公钥加密

    RSA算法的工作流程 1. 生成公钥私钥 生成两个素数p和q,计算n=p*q,计算φ(n)=n-p-q+1,然后生成e与d,使 e * d = 1 mod φ(n). 然后以(n, e)作为公钥,(n ...

  9. FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】

    [唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...

  10. HDU - 2970 Suffix reconstruction

    Discription Given a text s[1..n] of length n, we create its suffix array by taking all its suffixes: ...