sed基本用法
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的脚本:
Sed代码 1. #!/bin/sed -f
2. /file:/a\
3. We append a new line.\
4. 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的脚本,内容如下:
Bash代码 1. #!/bin/sed -f
2. # this is comment
3. # date : 2013/06/02
4. # author : xiongneng
5. /this is/i\
6. 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
sed基本用法的更多相关文章
- linux中sed的用法【转】
sed命令行格式为: sed [-nefri] ‘command’ 输入文本/文件 常用选项: -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的 ...
- sed命令用法详解
sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space) ...
- Linux中sed的用法实践
Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...
- SED命令用法整理
sed '/Started/'q 匹配到Started字符串则退出sed命令 sed '/Started/{/in/q}' 同时匹配到Started和in两个字符时则退出sed命令 ------- ...
- [转载]linux中sed的用法
转自:http://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html sed命令行格式为: sed [-nefri] ‘ ...
- Linux中Sed的用法
Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...
- sed高级用法:模式空间(pattern space)和保持空间(hold space)
摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...
- 正则表达式,sed简单用法
一. 正则表达式 1. 常见的正则表达式字符 [] 匹配字符集 grep "bl[lo]g" oldboy.txt 表示字符‘l’或者‘o’都可匹配 * 重复前面字符任意次 g ...
- Linux sed命令用法
概述 sed命令是一个面向字符流的非交互式编辑器,不允许用户与它进行交互操作.sed是以行为单位处理文本内容的.在shell中,可以批量修改文本内容. 用法 sed [选项] [动作] 选项与参数:- ...
- linux之sed的用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
随机推荐
- TCP数据包结构
源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程.目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应用进程.这两个值加上 IP 报头中的源主机 I ...
- JS学习之动态加载script和style样式
前提:我们可以把一个网页里面的内容理解为一个XML或者说网页本身也就是一个XML文档,XML文档都有很特殊的象征:"标签"也叫"节点".我们都知道一个基本的网页 ...
- [转]用android LinearLayout和RelativeLayout实现精确布局
先明确几个概念的区别: padding margin都是边距的含义,关键问题得明白是什么相对什么的边距. padding是控件的内容相对控件的边缘的边距. margin是控件边缘相对父控件的边距. a ...
- windows程序设计(三)
MFC所有封装类一共200多个,但在MFC的内部技术不只是简单的封装 MFC的内部总共有六大关键技术,架构起了整个MFC的开发平台 一.MFC的六大关键技术包括: a).MFC程序的初始化过程 b). ...
- linux和windows之间上传 下载文件 非ftp方式
用 命令 rz 上传 sz 下载 文件夹加上 -r rz上传替换时用 -y 谁用谁知道 两台linux传 : scp -r 文件夹 username@ip:路径 (如果传输文件就 ...
- The Accumulation of Capital
The Accumulation of Capital ---- by *Adam Smith Capitals are increased by parsimony, and diminished ...
- Java实现随意切换VPN改变上网地区
http://www.jb51.net/article/69267.htm 这篇文章主要介绍了Java实现随意切换VPN改变上网地区,本文直接给出实例代码,需要的朋友可以参考下 在很多情况下,有些网络 ...
- Entity Framework 6新功能Logging/Store Procedure
摘要 在Entity Framework6中有两个新的功能,DB Loggin和Stored Procedure的映射 Entity Framework 6已经从Beta版本来到了RC1版本,我们可以 ...
- Linux 挂载aliyun数据盘
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- 解读QML之四
解读QML之四 QML对象属性 每一个QML对象类型都定义了一系列属性.每创建一个该对象类型的实例,该实例的这些属性也自动被创建了.接下来我们讨论几种不同类型的属性. id属性 每一个QML对象类型都 ...