linux 命令之 sed

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_referee/article/details/83066642

sed 是 一种流编辑器。

这里给出 man sed 描述:

NAME
       sed - stream editor for filtering and transforming text

SYNOPSIS
       sed [OPTION]... {script-only-if-no-other-script} [input-file]...

DESCRIPTION
       Sed  is a stream editor.  A stream editor is used to perform basic text
       transformations on an input stream (a file or input from  a  pipeline).
       While  in  some  ways similar to an editor which permits scripted edits
       (such as ed), sed works by making only one pass over the input(s),  and
       is consequently more efficient.  But it is sed's ability to filter text
       in a pipeline which particularly distinguishes it from other  types  of
       editors.

简单说下, sed 是一种流编辑器。然后说了下,流编辑器一般用来干嘛 —— 一般用来处理输入流(文件或输入管道)的文本处理。sed 在管道文本过滤方面的能力是明显区别于其它编辑器的地方。

sed 命令的参数还是比较多的,这里说下几个常见的选项参数用法。

为了实验方便,首先写进去一段文本内容:

zhang@zhang:~$ cat >>sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

先说下最基本的"增删改查" 

 a  (如果指定了行的话,在指定行下面追加一行,没有指定就在每行下面)追加文本

zhang@zhang:~$ echo "新增一行"
新增一行
zhang@zhang:~$ sed '1a 这是sed 案例的开始' sed.txt
hello,world
 这是sed 案例的开始
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

  上面的 1a的意思是从在第1行下面追加一段文本。   

 d 删除指定的行,如果没有指定,那么会全部删除

zhang@zhang:~$ echo "演示删除第1行"
演示删除第1行
zhang@zhang:~$ sed '1d' sed.txt
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

 

zhang@zhang:~$ echo '不加行号,会全部删除'
不加行号,会全部删除
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ sed 'd' sed.txt | tee delete.txt
zhang@zhang:~$ cat delete.txt

 不知道你有没有发现,我们上面的操作,并没有对源文件的内容发生影响,如果你想同步操作到文件,可以加 i 参数,有风险慎用。

 

zhang@zhang:~$ echo "展示 i 参数 ,直接修改源文件"
展示 i 参数 ,直接修改源文件
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ sed -i "5,6d" sed.txt
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ 

可以看到上面删除第5,6 行的操作,直接同步到了文件上的。

 s 替换指定字符

zhang@zhang:~$ echo "展示替换操作"
展示替换操作
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ sed 's/world/xiaomu xizi/' sed.txt
hello,xiaomu xizi
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ 

 忘记说了,sed基本上是正则模式匹配,所以需要一点正则知识,才能把 sed 玩6.

 还可以加上个  g  ,来个全局匹配替换

zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ sed 's/blog/zhang/g' sed.txt
hello,world
my zhang name is xiaomu xizi 
my zhang address is zhang.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ 

  p 打印当前模式匹配行 

zhang@zhang:~$ echo "演示查找操作"
演示查找操作
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ sed '/zhang/p' sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
zhang@zhang:~$ 

 可以看到,匹配结果显示在了匹配行的下面,那如何只显示处理结果呢?可以使用 -n  

 -n, --quiet, --silent ,仅显示处理后的结果

zhang@zhang:~$ sed '/zhang/p' sed.txt -n
my blog address is blog.csdn.net/zhang_referee
zhang@zhang:~$ 

 可以看到我在栗子中,""(双引号) 和 '' (单引号) 交替使用,是想在这里说下,单双引号无所谓。

  我们在上面插入的时候适用的是 a 命令,是在指定行下面插入数据,也可以在指定行前面插入数据。

   i insert text, which has each embedded newline preceded by a backslash.

[root@ ~]# sed '1i hello world' sed.txt
hello world
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing

a 命令是在行后面追加,i 命令是在行前插入

 已匹配字符串标记&

 我们把下面的blog ,替换成--blog--

[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# cat sed.txt
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# sed 's/blog/--&--/g' sed.txt
my --blog-- name is xiaomu xizi 
my --blog-- address is --blog--.csdn.net/zhang_referee
I love programming and writing
[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# 

 还可以指定要替换的行号:

[root@i6Z ~]# cat sed.txt
my blog name is xiaomu xizi 
my blog address is blog.csdn.net/zhang_referee
I love programming and writing
[root@i6Z ~]# sed '2s/blog/--&--/g' sed.txt
my blog name is xiaomu xizi 
my --blog-- address is --blog--.csdn.net/zhang_referee
I love programming and writing
[root@i6Z ~]# 

上面就是sed 的基本操作,sed 是一款很强大的文本处理工具,结合正则表达式能完成很多复杂操作,但由于历史原因,sed 默认只支持基础正则,要想支持扩展正则,

   -r, --regexp-extended

              use extended regular expressions in the script.

 请使用 -r 参数。

  这里使用 sed 结合基础正则 ,来完成对html 标签的过滤。

zhang@zhang:~$ cat >> index.html
<html> 
<head>
<title>
document
</title>
</head>
<body>
<p> hello , xiao mu xi zi </p>
<h1> this is a html document</h1> 
</body>
</html>
zhang@zhang:~$ cat index.html
<html>
<head>
<title>
document
</title>
</head>
<body>
<p> hello , xiao mu xi zi </p>
<h1> this is a html document</h1>
</body>
</html>
zhang@zhang:~$ echo "过滤标签,提取文本"
过滤标签,提取文本
zhang@zhang:~$ sed 's/<[^<>]*>//g'  index.html



document



 hello , xiao mu xi zi 
 this is a html document


zhang@zhang:~$ 

这里只介绍了,sed 的基础用法,更多用法,请参考 man sed 。我个人建议是,要玩好 sed  ,正则表达式要玩的 6 才行的。也可以参考这个链接,讲的比较全:http://man.linuxde.net/sed

猜你喜欢

转载自blog.csdn.net/zhang_referee/article/details/83066642