sed是一个非交互式的文本编辑器;sed一行一行的处理文件
sed有模式空间(主要活动空间)和缓存空间(辅助空间)两个空间:
模式空间(pattern space)将文件中的一行内容读取到临时缓冲区(模式空间),经过处理后进行输出并清空空间内容;
保持空间(hold space):保持空间不会自动清空也不会主动打印,需要通过命令和模式空间进行交互,主要用于sed的高级命令处理,是sed的辅助空间。
一、正则表达式
很多工具语言都支持使用正则表达式,但是sed中有些正则不能用,sed不支持\d类、\D、\W反义类,零宽断言、懒惰(非贪婪)模式
sed中使用正则表达的注意点
1.sed默认为贪婪模式,不支持懒惰模式
2.sed中使用正则表达式注意sehll特殊字符冲突问题,比如\(exp\),但是可以使用-r参数解决冲突
3.sed中不支持使用\d和反义的\W等表达方式
下面是正则表达式的一些基础内容
【元字符】
. 匹配换行符之外的任意字符
\w 匹配字母、数字、下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始和结束
^ 匹配字符串的开始
$ 匹配字符串的结束
\ 转义字符(比如想要匹配.的时候需要进行转义)
【限定符】
* 重复0或更多次
+ 重复1次或更多次
? 重复0次或1次
{m} 重复m次
{m,} 重复m次或更多次
{m,n} 重复m到n次
{,n} 重复0次到n次
[1-9] 指定范围内的字符,1-9范围内的,或者a-z,A-Z,或者用逗号隔开的字符
【反义符】(大写的与元字符内容相反)
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意不是数字的字符
\B 匹配任意不是单词开头和结束的位置
[^xyz] 匹配除了xyz这几个字母以外的任意字符
【捕获】
(exp) 匹配exp,通过小括号捕获文本到自动命名的组里。
(?<name>ex) 匹配ex,并捕获文本到名称为name的组里
(?:exp) 匹配exp,不捕获匹配的文本,也不分配组号
【零宽断言】
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面跟的不是exp的位置
【贪婪与懒惰】
*? 重复任意次,但尽可能少的重复
+? 重复1次或更多次,但尽可能少的重复
?? 重复0次或1次,但尽可能少的重复
{n,m}? 重复n到m次,但尽可能少的重复
{n,}? 重复n次以上,但尽可能少的重复
二、sed基础命令
1.sed的命令格式
sed [-options] [commands] filename
sed [-options] --f scriptfile filename
command格式:
[address-range] [pattern-to-match] [sed-command]
例如:sed -n '5,8p' passwd(打印passwd文件中第5到第8行的数据)
下面是一个命令格式的图:
说明:
1.sed命令的寻址和正则表达式不是必填项
2.行号寻址:(line1,line2)使用m,n表示通过行号寻址,读取文件m到n行(例如5,8);如果只有一个数字m表示读取第m行
3.正则表达式寻址:(/pattern/ ),使用/pattern/来匹配行,正则需要放到//中。如果用到了()[]等需要用\进行转义;也可以使用sed的-r参数,这样就不需要转义了
4.使用行号和正则来寻址:(line1,/pattern/),来寻找line1行到匹配到/pattern/的行,如果找不到/pattern/则从line1开始一直读取到结束
【sed的-options】
-n 抑制输出,只打印匹配到的行。如果不加-n会打印出一行行读入缓冲区后默认打印的所有行。
例如下面的打印passwd文件以bash结尾的内容:
不加-n:
加-n:
-i 修改原文件。比如删除d,追加a,修改等
-r 正则匹配时,不需要对()进行转义了
-e 多重编辑。sed -e '1,3d' -e 's/abc/def/g' filename
【sed的command的命令】
p 打印
d 删除(如果需要直接操作原文件,需要用到sed -i 操作)
s 1.提取内容,s/正则表达式/\1\2/p。s/(.*)/\1/p(\1表示捕获第一个小括号内的内容。\n来表示第n个捕获的内容)
2.替换内容,s/要替换的内容/替换的内容/g。如果用g表示全局替换,不加g只替换找到的第一个字符串
i 在匹配的行前加入一行。sed -i '5i\要插入的内容\' filename
a 在匹配的行后追加一行。sed -i '5a\要追加的内容\' filename
如果是要在匹配到的正则后追加一行: sed -ie '/正则内容/a\"要追加的内容"' filename
如果要追加的内容共使用了变量,需要用\对$进行转义,正则中的不需要加\:sed -ie "/$a/a\\$b" filename
c 修改匹配到的行。sed -i '5c\要修改的内容' filename
y 转换符。y/要转换的字符/转换后的字符/。注意:要转换的字符和转换后的字符个数是相等的,且是一一对应的关系。如果有多个字符要转换,他会按照命令中的位置将对应的字符全部转换成转换后的样子
q 退出。不再进行sed处理
w 写到新文件。sed '/要匹配的行/w newfile' filename
2.sed命令的实战
【查找】
例子:查找passwd文件中以bash结尾的行并打印出来
sed -n '/bash$/p' passwd
【删除】
例子:删除passwd中以test开头的行
sed -i '/^test/d' passwd
【打印】
例子:打印passwd文件中第3到第8行的内容
sed -n '3,8p' passwd
【提取】
例子:提取passwd中有登录shell(结尾为bash)的用户名及其家目录
下面两种写法结果都一样。s命令前可以先用正则匹配行
sed -rn 's/(.*)[x:0-9]*([\/a-z]*):\/bin\/bash$/\1 \2/p' passwd
sed -nr '/bash$/s/(\w+):\w:[0-9]+:[0-9]+:.*:(.*):.*/\1 \2/p' passwd
【替换】
例子:将passwd文件中的nologin全部替换为meitian
sed -i 's/nologin/meitian/g' passwd
注意:如果不加g则只会替换第一个字符串,加g是全局的进行替换
【插入】
例子:在passwd第5行上插入一行hello world
sed -i '5i\hello world' passwd
例子:在psswd第5行下面追加一行hello world
sed -i '5a\hello world' passwd
【修改】
例子:将第5行的内容修改为hello world
sed -i '5c\hello world' passwd
【转换】
例子:将abcdef转换成对应的数字123456
echo "aaddddxxxxaacfedbsdf"| sed 'y/abcdef/123456/'
【退出】
例子:passwd文件,处理到第5行退出
sed '5q' passwd
三、实战中的一些注意点
1.在sed命令中使用变量($a类型),sed后面的命令必须使用双引号括起来,否则$会被当成普通字符
例子:将passwd文件中的root变更为变量name中的值
sed -i "s/root/$name/g" passwd
2.修改内容时,可以使用正则的()捕获内容,然后通过\1等简化要修改的脚本
例子:去掉hosts文件前所有行前面的#号
sed -i 's/^#(.*)/\1/g' hosts
3.将sed提取到的值赋值到变量
例子:将本机的IP地址赋值到变量ip。
方法一:使用变量名=$(打印变量值)
ip=$(ifconfig eth0 | sed -nr 's/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/\1/p'
) .png)
方法二:使用eval $(打印变量名=变量值)
eval $(ifconfig eth0 | sed -nr '/inet/s/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/ip=\1/p' )
4.sed命令在使用时会在当前处理的文件目录下生成一个缓存文件,但是有的文件目录只有root有权限。如果我们没有root权限,也不知道sudo的密码。可以将文件先cp到一个有权限的目录下进行操作,然后文件处理后再cp回来。
sed还有很多高级命令,比如G等,可以再多了解一下,以便达到更高效的使用。
用了awk和sed后,我个人觉得如果只是对数据进行提取,用awk更灵活更方便。而对一个文件进行编辑修改,还是用sed更方便一些。各有各的好处。另外在使用awk处理文件时会感觉处理过程有点慢。
- sed命令基础
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space ...
- sed命令基础2
我在sed命令基础里面说了一下sed的基础用法,sed还有一些高级用法,由于我也是在学习中,写的博客可能会有想不到的地方,有问题希望大家指出. sed的高级用法主要在于两个空间的使用,模式空间和保持空 ...
- sed的基础用法简介
sed 最近学习了一些sed的相关知识,初步接触sed以后给我的感受主要有两点.首先是sed强大的功能,学了以后发现之前写的脚本利用sed以后会简化很多啊,具体的有些利用sed编辑shell脚本的思路 ...
- Sed命令基础操作
sed用法的小技巧 (1)在查找范围时不需要用到替换,所以不用s; (2)当只需要打印被修改行时,可以使用-n 和 –p 选项,注意二者一定配合使用: 3种方式指定命令行上的多重指令 (1)用逗号分隔 ...
- sed编辑器基础
一. 更多的替换选项 ①替换标记 root@localhost sed]# cat data4.txt This is a test of the test script. This is the s ...
- 《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk
这两个工具能够极大简化需要进行的数据处理任务. 19.1 文本处理 能轻松实现自动格式化.插入.修改或删除文本元素的简单命令行编辑. sed和gawk就具备上述功能 19.1.1 sed编辑器 被称为 ...
- sed命令总结-Linux
sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...
- LVS负载均衡-基础知识梳理
一. 集群的概念 服务器集群简称集群是一种服务器系统,它通过一组松散集成的服务器软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台服务器.集群系统中的单个服务器通常称 ...
- 自学Linux Shell18.1-sed编辑器基础特性
点击返回 自学Linux命令行与Shell脚本之路 18.1-sed编辑器基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed概念 sed是stream edito ...
随机推荐
- Jacoco的原理
覆盖率计数器 Jacoco使用一系列的不同的计数器来做覆盖率的度量计算.所有这些计数器都是从java的class文件中获取信息,这些class文件可以(可选)包含调试的信息在里面.即使在没有源码的情况 ...
- scrollTop和scrollLeft属性
外层元素的高度值是200px,内层元素的高度值是300px.很明显,“外层元素中的内容”高过了“外层元素”本身.当向下拖动滚动条时,有部分内容会隐没在“外层元素的上边界”之外,scrollTop就等于 ...
- 使用c++实现一个FTP客户端(二)
接上篇http://www.cnblogs.com/jzincnblogs/p/5213978.html,这篇主要记录编程方面的重点. 客户端使用了Windows Socket提供的API,支持上传. ...
- WebGL编程指南案例解析之绘制四边形
//案例4,绘制矩形,和三角形类似,但是注意因为一个矩形有4个顶点,按照两个三角形绘制矩形的话,顶点顺序要注意 var vShader = ` attribute vec4 a_Position; v ...
- Jmeter-配置元件
CSV Data Set Config(CSV数据集配置) 参考:http://www.cnblogs.com/yanzhe/p/7728139.html DNS Cache Manager(DNS缓 ...
- 【消息队列值Beanstalk】beeanstalk初识
Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...
- Cannot find name 'AsyncIterator' error in Typescript compilation process 问题解决
解决方法: tsconfig.json: 添加lib 编译选项 { "compilerOptions": { "lib":[ "esnext.asyn ...
- CF gym101933 K King's Colors——二项式反演
题目:http://codeforces.com/gym/101933/problem/K 每个点只要和父亲不同色就行.所以 “至多 i 种颜色” 的方案数就是 i * ( i-1 )n-1 . #i ...
- 手写简易WEB服务器
今天我们来写一个类似于Tomcat的简易服务器.可供大家深入理解一下tomcat的工作原理,本文仅供新手参考,请各位大神指正!首先我们要准备的知识是: Socket编程 HTML HTTP协议 服务器 ...
- web常用测试点记录
输入框 1.字符型输入框: 单行文本输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”,特别要注意单引号和&符号.如果禁止直接输入特殊字符时,使用 ...