sed的基础应用

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

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‘

  

方法二:使用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处理文件时会感觉处理过程有点慢。

时间: 2024-12-25 14:21:32

sed的基础应用的相关文章

sed命令基础用法

    sed(Stream EDitor)简介 sed是一个流编辑器编辑器,本身是一个管道命令,主要以行为单位处理文本文件,可以将数据进行替换.删除.新增.选取等特定工作:sed并不会处理文本文件本身,而是每当处理一个文件时,按顺序逐行读取到模式空间(内存)中,而后在模式空间中完成编辑,把编辑的结果输出到屏幕上,接着处理下一行,反复操作,直到文件结尾. 模式空间:将读取的内容放在内存中的一块区域编辑,这些内存空间就称为模式空间 格式: sed [options]    'Address Com

文本三剑客之一 “sed”的基础用法和高级用法

sed工具: 用法: sed [option]- 'script' inputfile- 常用选项: -n:不输出模式空间内容到屏幕,即不自动打印[[email protected] ~]# sed -n -e "2p" -e "6p" f1 (2:6代表处理第几行)-e: 多点编辑-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本-r: 支持使用扩展正则表达式-i.bak: 备份文件并原处编辑 script: '地址命令' 地址定界: (1) 不

Sed 的基础用法

sed [ -nefr] [n1,n2] action -n: 是安静模式,只有经过sed处理的行才会显示,其他不现实 -e:表示直接在命令行上执行.是默认选项不用填写. -f: 将Sed的操作写在一个文件里面,用的时候-f filename 就可以按照内容进行Sed操作 -r :表示支持正则表达式 n1,n2 代表的是行数 Sed的action (动作)支持如下参数 a: 表示添加,后接字符串,添加到当前行的下一行 c:表示替换,后接的字符串,用它来替换N1到N2之间的行 d:删除行 i:表示

sed命令基础及高级用法

sed工具:sed是文本流编辑器,逐行对文件的内容进行处理 用法:sed [option] ... 'script' inputfile... 选项: -n:静默模式,不输出模式空间的内容至屏幕 -e:实现多点的功能编辑 -f /path/from/script_file:从指定的文件读取编辑脚本 -r:支持使用扩展的正则表达式 地址界面方法: (1)不给地址:对全文进行处理 (2)一个地址(单地址) #:指定的行 /pattern/:被引用处模式所能够匹配到的每一行: (3)地址范围 #,#:

正则表达式(基础和扩展)

在Linux系统中常见的文件处理工具中grep和sed支持基础正则表达式. grep--正则表达命令,用来过滤文件内容. 选项: -i:查找时不区分大小写字母: -v:反向查找,将不符合查找条件的列都显示出来: -n:将输出的结果显示行号: -A:后面可以追加数字,为after的意思,除了列出该行外,后面的n行也列出来: -B:与"-A"的作用相反,它是除了该行以外,前面的n行也列出来: 示例(在命令执行后的输出结果中,标红的就是查找到的内容): [[email protected]

shell编程之正则表达式(一)基础正则表达式

正则表达式之前学习了 Shell 脚本的基础用法,已经可以利用条件判断.循环等语句编辑 Shell 脚本.接下来我们将开始介绍一个很重要的概念--正则表达式(RegularExpression,RE).正则表达式的定义正则表达式又称正规表达式.常规表达式.在代码中常简写为 regex.regexp 或 RE.正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找.删除.替换某个特定字符串.正则表达式是由普通字符与元

LVS负载均衡-基础知识梳理

一. 集群的概念 服务器集群简称集群是一种服务器系统,它通过一组松散集成的服务器软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台服务器.集群系统中的单个服务器通常称为节点,通常通过局域网连接,但也有其它的可能连接方式.集群服务器通常用来改进单个服务器的计算速度和/或可靠性.一般情况下集群服务器比单个服务器,比如工作站或超级服务器性能价格比要高得多.集群就是一组独立的服务器,通过网络连接组合成一个组合来共同完一个任务. 说的直白点,集群就是一组相互独立的服务器,

一年的路

今天又有什么事情发生呢?好吧,今天下午业主公司要上市了,有人过来录像,这次看来要上电视了哈哈. 快下班的时候群里聊到了运维之路,我把李昂师兄一年前写的博文拿给他们看了http://linuxnote.blog.51cto.com/9876511/1642287,回想一年前,我看到这篇文章的时候,觉得,哇--还要学的东西好多啊,也是这篇文章让我了解到linux之路需要学的东西.那个时候,加了不少linux群,就看见有些大牛发的sed,awk语句,那个时候根本看不懂,就觉得太厉害了,自己什么时候才能

vim的末行模式讲解

末行模式重点讲解(这是学好sed的基础) 1)地址定界 :start_pos[,end_pos] #: 特定的第#行,例如5 为第五行.: 当前行$:最后一行 #,#:指定行范围,左侧为起始行 #,#+:指定行范围,右侧为左侧行的偏移量 ,例如:3,+7%:全文 /pattern/:第一次被模式所匹配到的行 2:可实现编辑操作 ,同编辑命令一同使用d:表示直接删除,要求直接跟在地址定界符号的后面, 例如::.,$d 表示当前行到最后一行删除.y:用来复制地址定界匹配到的行c:用来修改地址定界匹配