`

《Linux Shell》之二:sed命令

阅读更多

4.1 sed命令基本用法

sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入、文件重定向、字符串、变量、来自管道的文本等等。

sed从文本的一个文本行或标准输入中读取数据,将其复制到缓存区,然后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本中所有命令都执行完了。sed可以一次性处理所有的编辑命令,非常高效

 

sed适用于下面三种场合:

* 编辑相对于交互式文本编辑器而言太大的场合

* 编辑命令太复杂,在交互式文本编辑器中难以输入的情况

* 对文件扫描一遍,但是需要执行多个编辑函数的情况

 

sed只是对缓存区中原始文件的副本进行编辑,并不编辑原始文件。因此,如果需要保存更改内容,需要将输出重定向到另一个文件,可以使用下面的命令:

sed 'sed命令' input_file > result_file

或者还有另一种方法就是 -w 选项,这个后面讲到

 

有三种方式调用sed:

① 直接在shell命令行上调用

# sed [选项] 'sed命令' 输入文件

② 将sed命令插入脚本文件后,通过sed命令调用脚本:

# sed [选项] -f sed脚本文件名 输入文件

③ 将sed命令写入脚本文件后,将其+x变成可执行

./sed脚本文件 输入文件

第三种方式需要在文件头部加上 #!/bin/sed

 

sed命令的常用选项:

-n    不打印所有行到标准输出

-e    表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令,-e可以省略

-f     表示正在调用sed脚本文件

 

sed命令通常由定位文本行和sed编辑命令两部分组成,sed编辑命令对定位到的行进行各种编辑处理

sed提供两种方式定位文本行:

* 使用行号,指定一行或者行号范围

* 使用正则表达式

 

sed命令定位文本行的方法:

选项 意义
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从与pattern的匹配行到x号行之间的行
x,/pattern/ 从x号行到与pattern的匹配行之间的行
x,y! 查询不包含x和y行号的行

 

===================================分割线=======================

sed编辑命令表

选项 意义
p 打印匹配行
= 打印匹配行号
a\ 在定位行之后追加文本信息
i\ 在定位行之前插入文本信息
d 删除定位行
c\ 用新文本替换定位行
s 使用替换模式替换相应的模式
r 从另一个文件中读文本
w 将文本写入到另一个文件中
y 变换字符
q 第一个模式匹配完成后退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓存区的文本复制到保持缓存区
H 将模式缓存区的文本追加到保持缓存区
x 互换模式缓存区和保持缓存区的内容
g 将保持缓存区的内容复制到模式缓存区
G 将保持缓存区的内容追加到模式缓存区

 

========================分割线============================

各个选项和编辑命令详解:

1,sed命令的-n选项和p命令

# sed -n '1p' input

# sed '1p' input

从输出可以看出,加了-n后标准输出上只有第一行打印出来了,而不加-n时候,先打印第一行,然后打印整个文件内容。所以-n选项的意义是:不打印sed编辑内容也就是input的全部内容。只打印匹配的行

# sed -n '3,6p' input   --> 打印从3到6行

# sed -n '/certificate/p' input  --> 打印匹配模式行,注意大小写是敏感的

 

2,sed命令的-e选项

由于sed不支持同时带多个编辑命令的用法,因此需要用-e选项指定每个编辑命令

# sed -n -e '/Certificate/p' -e '/Certificate/=' input

 

3,sed命令的-f选项

-f选项只有调用sed脚本文件时才起作用,追加文本、插入文本、修改文本、删除文本和替换文本等功能往往需要几条sed命令才能完成,所以,往往将这些命令写入sed脚本,然后调用sed脚本来完成。

下面是这个sed的脚本:

#!/bin/sed -f
/file:/a\
We append a new line.\
We append another line.

注:上面的/file:/a\中的\表示在换新行后添加内容,而下面内容中的\也表示换行。

 

4.2.2 sed文本定位的一组例子

1. 匹配元字符

如果目标字符串中包含元字符,需要使用转义符\屏蔽其特殊意义。

# sed -n '/\./p' input --> 打印含有.的行

2. 使用元字符进行匹配

sed可以灵活使用正则表达式的元字符进行匹配,不过注意的是:$在正则表达式中表示行尾,但是在sed命令中却表示最后一行,而写在//中间的$就表示行尾了,哈哈。

# sed -n '$p' input --> 打印最后一行

# sed -n '/^$/p' input -> 打印空行

3. !符号

!表示取反,也就是不满足条件的时候就处理

# sed -n '/.*this/!p' input  --> 打印不包含this的行

# sed -n '3,6!p' input --> 打印不在3至6行间的行

 

4.2.3 sed基本编辑命令的一组例子

1. 插入文本

插入文本和追加文本类似,区别仅仅是追加文本是在匹配行的后面插入,而插入文本是在匹配行的前面插入

sed插入文本符号位i\,插入文本的格式为:

sed '指定地址 i\text' 输入文件

新建名为insert.sed的脚本,内容如下:

#!/bin/sed -f 
# this is comment
# date : 2013/06/02
# author : xiongneng
/this is/i\
We insert a new line #插入的文本内容

 

 2. 修改文本

修改文本是指将所匹配的问本行用新文本代替,也就是只能整行替换,sed修改文本符号位c\

sed '指定行 c\text' 输入文件

 

3. 删除文本

sed删除文本命令可以将指定行或指定行范围进行删除,sed的删除文本符号为d

sed '指定行 d' 输入文件

 

4.替换文本

sed替换文本将所匹配的文本行中找到的字符串用新的字符串去代替,常用。而上面的修改文本只能整行,sed替换文本符号为s

sed -n 's/被替换的字符串/新的字符串/p' --> 只替换每行中第一次找到的

sed -n 's/被替换的字符串/新的字符串/gp' --> 替换每行中所有找到的

sed -n 's/被替换的字符串/新的字符串/np' --> 替换每行中第n次找到的

sed替换文本中有个重要的符号&,它表示保存被替换的字符串以供调用。

比如下面两条命令等级:(都是将this字符串用括号括起来)

# sed -n 's/this/(&)/gp' input

# sed -n 's/this/(this)/gp' input

 

5. 写入到一个新文件

上面提到的都是对缓存区中输入文件的复制内容进行编辑,如果要保存编辑结果,需要将编辑后的文本重定向到另一个文件,sed写入文件符号为w,基本格式为:

# sed -n '1,5 w output' input

# sed -n '/this/2 output' input

# sed -n 's/this/(&)/gw output' input  --> 将this加上括号后,匹配行写入到output中去

注:这里写到新文件中的只有匹配的行修改后的数据,如果要整个文件内容都写进去,使用重定向>> 或者>

 

6. 从文件中读入文本内容

sed命令还可以将其他文件中的内容读入,并附加在指定地址后,sed读入文件的符号为r

# sed '/this/r otherfile' input

 

7. 退出命令

sed命令的q选项表示完成指定地址匹配后立即退出

# sed -n '/this/p' input  --> 打印出匹配的全部字符串

# sed -n -e '/this/p' -e '/this/q' test.txt  --> 找到第一个匹配的打印后就立即退出

 

8. 变换命令

sed命令的y选项表示字符变换,它将一系列的字符变换为相应的字符,逐个处理的

# sed 'y/被变换的字符序列/变换的字符序列/' 输入文件

# sed 'y/12345/ABCDE' input --> 将input中1变成A,2变成B,3变成C,4变成D,5变成E

 

9. 显示控制字符

sed 1命令可以显示出文件中的控制字符,比如退格键、F1键、Shift键等

# sed -n '1,$1' input

 

10. 在定位行执行命令组

sed编辑命令中的{}可以指定在定位行上所执行的命令组,它的作用与sed的-e选项类似,都是为了在定位行执行多个编辑命令。

下面的命令等价:

# sed -n -e '/this/p' -e '/this/q' test.txt 

# sed -n '/this/{p;q}' test.txt -->显然这个更NB点

 

4.2.4 sed高级编辑命令的一组例子

1. 处理匹配行的下一行

sed编辑命令n的意义是读取下一个输入行,用n后面的一个命令处理该行,由于此时通常有个多个编辑命令,所以命令n需要与{}配合使用

# sed '/this is/{n;s/her/him/;}' input --> 找到this is关键词那行,然后将它下一行的her替换成him

 

2. sed缓存区的处理

前面提到的所有编辑命令都是将输入文件复制到缓存区,对缓存区的复制内容进行处理。实际上,sed有两个缓存区,模式缓存区 Pattern Buffer 和保持缓存区 Hold Buffer。前面都是Pattern Buffer,而保持缓存区是另一个内存空间,sed的一些编辑命令可以对保持缓存区进行处理,并与模式缓存区的内容互换

# sed h、x、G命令的用法

# sed  '/subject/h; /object/x; $G' input

解释下:

第一个h命令是将模式缓存区内容复制到保持缓存区,也就是说当找到subject的行的时候,就将该行复制到Hold Buffer,如果该行有object关键词就将模式缓存区和保持缓存内容互换后输出模式缓存区内容,第三条命令表示如果是到了最后一行,就直接输出保持缓存区内容。

 

h和H、g和G是两组对应的命令

h和H命令是将模式缓存区内容替换掉保持缓存区内容,不过h是副本,即将保持缓存区的就内容覆盖掉,而H是追加,即在保持缓存区内容上增加新的内容

g和G是将保持缓存区内容替换掉模式缓存区内容,同样,g是副本、G是追加。

 

3.利用分号;分割多个编辑命令,这个比起-e选项更NB一点。^_^

# sed  '/subject/h; /object/x; $G' input

 

博客新地址:http://yidao620c.github.io

 

分享到:
评论

相关推荐

    linux-shell脚本命令:sed命令简介

    sed命令的基本格式是:sed [-nefri] 'range command' file。其中,-n选项告诉sed不要默认打印每行处理的结果;-e选项允许在命令行直接编写编辑动作;-f选项可以将编辑动作写在一个文件中,然后sed执行这个文件中的...

    Linux主要shell命令、sed、awk使用详解

    Linux 主要shell命令、sed、awk使用详解 Linux 主要shell命令详解 shell 是用户和 Linux 操作系统之间的接口。Linux 中有多种 shell,其中缺省使用的是 Bash。本章讲述了 shell 的工作原理,shell 的种类,shell ...

    Linux shell 用sed命令在文本的行尾或行首添加字符

    Linux shell 用sed命令在文本的行尾或行首添加字符 sed 命令是 Linux shell 中的一个流编辑器,可以用来对文本进行各种处理操作,例如,添加、删除、替换文本中的字符。今天我们将讨论如何使用 sed 命令在文本的行...

    Linux Shell脚本编程--sed命令详解.zip_shell sed_命令介绍_脚本 shell

    在Linux系统中,Shell脚本编程是日常自动化任务和系统管理的重要工具,而`sed`(流编辑器,Stream Editor)则是Shell脚本中的一个强大工具。本文将深入讲解`sed`命令的基本概念、功能以及在Shell脚本中的具体应用。 ...

    linux shell命令sed的使用方法

    linux shell命令sed的使用方法

    LINUX_sed命令详解

    **Linux中的sed命令详解** `sed`(流编辑器,Stream Editor)是Linux系统中一个强大的文本处理工具,常用于处理文件或从输入流中过滤数据。它可以在不改变原文件的情况下,对文本进行查找、替换、删除等操作。下面...

    shell ant sed命令

    标题中的"shell ant sed命令"涉及的是三种在Unix/Linux及类似操作系统中常用的命令行工具,它们在IT领域尤其是软件开发和系统管理中扮演着重要角色。 1. **Shell**:Shell是操作系统提供的一种命令行解释器,允许...

    快速理解linux流编辑器sed命令

    ### 快速理解 Linux 流编辑器 sed 命令 #### 一、sed 命令简介 `sed` 是 `stream editor` 的缩写,作为一种非交互式的流编辑器,它主要用于文本数据的过滤和转换。不同于 `vi` 或 `vim` 这类编辑器,`sed` 不会...

    Linux学习笔记【博文整理系列】

    Linux笔记——命令:sed Linux笔记——命令:grep Linux笔记——命令:find Linux笔记——命令:Sort,uniq,join,cut,paste,split Linux笔记——shell基础:变量&本地变量&位置变量&特定变量参数 Linux笔记——条件测试...

    linux shell sed从入门到精通

    sed命令是Linux shell中一个功能强大的流编辑器,它可以对文本进行各种操作,如打印、删除、替换、修改等。下面是sed命令的详细用法和知识点: 一、基本用法 sed的基本用法是将输入文本传递给sed命令,并使用选项...

    Linux Shell编程&常用shell命令

    Linux Shell编程与常用Shell命令是Linux系统管理及自动化工作中的核心技能。Shell是Linux操作系统下的一种命令行解释器,它提供了用户与操作系统内核交互的界面。通过编写Shell脚本,用户可以自动化执行一系列任务,...

    Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本

    Linux 文件内容查看命令 - 关键词:cat, head, tail, more, less, sed, vi, grep Linux 文件压缩和解压 - 关键词:tar, gzip, zip, unzip Linux 用户管理 - 关键词:groupadd, groupdel, groupmod, useradd, userdel...

    shell命令之-SED

    **Shell命令之-SED** SED(Stream Editor)是Linux/Unix系统中的一种流式文本编辑器,它在处理文本时不需要打开或保存文件,而是直接读取标准输入或指定文件的内容,进行各种操作后再输出。这个强大的工具广泛应用...

    Linux-shell脚本全面学习.pdf

    * 在 shell 脚本中可以使用三类命令: Unix 命令、流程控制命令和 Shell 内置命令 * Unix 命令: + `echo`:将文字容打印在屏幕上 + `ls`:文件列表 + `wc`:计算文件行数、单词数和字符数 + `cp`:文件拷贝 + ...

    linux shell sed instead

    在Linux系统中,shell脚本是自动化任务的强大工具,而sed(流编辑器Stream Editor)则是shell脚本中...通过熟练掌握sed命令,你可以高效地处理大量文本数据,进行各种复杂的文本操作,提升Linux shell脚本的编写效率。

    Unix/Linux sed命令手册

    ### Unix/Linux sed命令手册知识点详述 #### 一、引言 **Sed** (Stream Editor) 是一种在 Unix 和 Linux 系统中用于文本处理的强大工具。它允许用户通过命令行来自动化文本编辑任务,使得批量编辑文件变得更加简单...

    Shell编程高级进阶系列视频.zip

    17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED命令实战 19Shell编程之awk、sed演练 20Shell编程之awk、sed演练( 21Shell编程grep正则实战讲解 22Shell编程grep正则实战讲解 23Shell脚本综合案例...

Global site tag (gtag.js) - Google Analytics