自学Linux Shell18.1-sed编辑器基础特性
18.1-sed编辑器基础特性
linux世界中最广泛使用的两个命令行编辑器:
- sed
- gawk
1. sed概念
sed是stream editor的简称,也就是流编辑器。sed 是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
sed编辑器会执行以下操作:
- 一次从输入中读取一行数据。
- 根据所提供的编辑器命令匹配数据。
- 按照命令修改流中的数据。
- 将新的数据输出到STDOUT。
在流编辑器将所有命令和一行数据匹配完毕后,它会读取下一行数据重复这个过程。
解析:
首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
2. sed命令格式
sed OPTIONS... <SCRIPT> [INPUTFILE...]
- -n 使用安静(silent)模式(想不通为什么不是-s)。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;
- -e 直接在指令列模式上进行 sed 的动作编辑;
- -f 直接将 sed 的动作写在一个文件内,
-f filename
则可以执行filename内的sed命令; - -r 让sed命令支持扩展的正则表达式(默认是基础正则表达式);
- -i 直接修改读取的文件内容,而不是由屏幕输出。
2.1 在命令行定义sed编辑器命令
sed中y命令与s命令的区别
- y一般是行级别的替换,s一般是列级别替换(当然也可以转换成行级)
- s替换的是整体,y替换的是每一字母对应的单个字母, 会用斜线间的第二个文本字符串来替换第一个文本字符串
2.2 在命令行使用多个sed编辑器命令
- 在命令行使用多个sed编辑器命令,就需要使用 -e 选项。
- 同时使用多个编辑命令,命令之间要用;隔开(!除外),并且在命令末尾和分号之前不能有空格
- 也可以使用次提示符来分割命令
2.3 在文件中读取sed编辑器命令
在sed命令中用 -f 选项来制定文件。这种情况下,不用在每条命令后面放一个分号。
3. sed编辑器基础
3.1 更多的替换选项
S命令:行中替换文本,替换的是整体,默认情况下只替换没行中出现的第一处
s/原文本/新文本/标记位 , 标记为如下:
- p :显示替换成功的行
- g :全局替换
- w filename : 将替换成功的结果保存至指定文件中
- 数字: 标明新文本将替换第几处模式匹配的地方
3.2 使用地址
如果只想将命令作用在特定行货某些行,就必须使用 行寻址 。
在sed编辑器中有两种形式的行寻址:
- 以数字形式表示行区间
- 用文本模式来过滤行
指定的格式一:
[address] command
指定的格式二(多个命令组):
address] {
command1
command2
command3
....
}
3.2.1 数字方式的行寻址
使用数字方式的行寻址,可以用行的文本流中的行位置来引用。
- 在命令中指定的地址可以使单个行号,或是用起始行号、逗号以及结尾行号指定的一个区间范围内的行
- 可以使用行地址区间
- 可以使用 $ 符号,将命令作用到文本中从某行开始的所有行。
3.2.2 使用文本模式过滤器
格式: /pattern/command
- 必须使用/将要指定的pattern封起来
- 会将该命令作用到包含指定文本模式的行上。
3.2.3 命令组合
- 如果需要在单行上执行多条命令,可以使用花括号将多条命令组合在一起
- 也可以在一组命令前指定一个地址区间
3.3 删除行 d命令
之前讲的都是替换命令s , 其实还有很多其他命令。
删除命令d ,会删除匹配指定寻址模式的所有行。
- 若没有添加寻址模式,所有文本行都会被删除
- 通过行号指定或区间指定或特殊符号&,可以删除特定的文本行
- sed编辑器的模式匹配也适用于删除命令
- 重点: 没有删除原文本
3.4 插入和附件文本
- 插入命令 i 会在指定行前增加一个新行, 文本会出现在数据流文本的前面。
- 附加命令 a 会在指定行后增加一个新行, 文本会出现在数据流文本的后面。
- 他们不能再单个命令行上使用,必须指定是要将行插入还是附加到另一行
- 通过行号指定或区间指定或特殊符号&,可以插入或附加特定的文本行
- $a\ 可以直接附件在文本最后一行
- 要插入或附加多行文本,必须要插入或附加的新文本的每一行使用反斜线
- sed编辑器的模式匹配也适用
格式 :
sed '[address] command\
new line '
3.5 修改行
- 修改行命令 c 修改数据流中整行文本的内容
- 他们不能再单个命令行上使用,必须指定是要将行插入还是附加到另一行
- 在使用行号区间指定时,需要注意是用这一行文本替换数据流中的两行文本,而不是逐一修改这两行文本。
- sed编辑器的模式匹配也适用
3.6 转换行
转换命令 y 是唯一可以处理单个字符的sed编辑器命令。
格式:
[address]y/inchars/outchars/
- inchars和outchars 值一对一映射
- inchars中的第一字符会被转换成outchars的第一字符;inchars中的第二字符会被转换成outchars的第二字符;以此列推
- 如果inchars 和outchars的字符长度不符,就会报错
- y命令不是所有系统的sed编辑器都存在的
3.7 打印数据流中的信息
- p命令用来打印文本行, 一般与sed -n 组合使用
- = 命令用来打印行号
- l 命令用来列出行
3.8 使用sed处理文件
- w 命令用来向文件写入行。
- r 命令允许将一个独立文件中的数据插入到数据流中
自学Linux Shell18.1-sed编辑器基础特性的更多相关文章
- 自学Linux Shell18.2-sed编辑器高级特性
点击返回 自学Linux命令行与Shell脚本之路 18.2-sed编辑器高级特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed小结 命令格式: 1 sed [opt ...
- 自学Linux Shell10.1-使用编辑器vim
点击返回 自学Linux命令行与Shell脚本之路 10.1-使用编辑器vim 所有的 Unix系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在.但是目前我们使用比较多的是 vim 编辑 ...
- 自学Linux Shell18.3-sed实用工具
点击返回 自学Linux命令行与Shell脚本之路 18.3-sed实用工具 1. 加倍行间距 命令格式: .......
- sed编辑器基础
一. 更多的替换选项 ①替换标记 root@localhost sed]# cat data4.txt This is a test of the test script. This is the s ...
- Linux上bash的部分基础特性:
命令补全: tab shell程序在接收到用户执行命令的请求,分析完成后,最左侧的字符串会被当做命令 命令查找机制: 查找内部命令: 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名 ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- shell编程之sed编辑器&gawk程序
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...
- 自学Linux Shell19.1-gawk程序基础特性
点击返回 自学Linux命令行与Shell脚本之路 19.1-gawk程序基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. gawk概念 awk是一个强大的文本分析工具 ...
- 自学Linux Shell19.2-gawk程序高级特性
点击返回 自学Linux命令行与Shell脚本之路 19.2-gawk程序高级特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. gawk使用变量 编程语言共有的特性是使用变 ...
随机推荐
- SPOJ33&POJ1934 Trip LCS
题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...
- C#去除字符串中的反斜杠
如下,可以使用C#的Replace()方法来替换,但有一点需要注意的是backslash(反斜杠)是特殊字符. string s = "[\"aaaaaaaaaaaaaaaaaaa ...
- Luogu P1966 火柴排队
这还是一道比较简单的题目,稍微想一下就可以解决.终于有NOIP难度的题目了 首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式 所以我们只需要改变第一组火柴的顺序,使它和第二组火 ...
- Part 6:静态文件--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 前面我们编写了一个经过测试的投票应用,现在让 ...
- Centos7 -- glibc 升级失败、意外删除、故意删除后的处理方法
第一部分:测试(如果不是想测试效果,可以直接跳到第三部分) 鉴于不久前 glibc-2.29 升级失败导致一系列的工具无法正常使用,‘’ 本着研究精神的我决定删除 glibc及其库文件 ,测试影响范围 ...
- libgdx学习记录27——线段与线段相交检测
给定p1, p2, p3, p4四个点,p1,p2为一条线段,p3,p4为一条线段,检测其是否有交点. 可分为三种情况: 1. L2与x轴平行 2. L2与y轴平行 3. L2与坐标轴不平行. (L1 ...
- Python基础(中)
前言 print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") print(&q ...
- Item 9: 比起typedef更偏爱别名声明(alias declaration)
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item ...
- LVS+Keepalived 高可用环境部署记录(主主和主从模式)
之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...
- C++STL——优先队列
一.相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这 ...