shell脚本学习笔记 (流编辑器sed)

     sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed不仅仅支持正则表达式,它还有一些比较厉害的功能。

      我给出一个例子,大家看看有什么办法可以解决它吧。

Hello World
Welcome to the world of regexp!
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  : 做的操作会修改原文件

shell脚本学习笔记 (流编辑器sed)_第1张图片

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

写错了,结果将整个工程的重要代码给替换了,最后想进入工程按 ‘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) . '\<' ,'\>'

     shell脚本学习笔记 (流编辑器sed)_第2张图片

     


    下面的两种用法比较特殊,是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,脚本学习笔记)