shell sed详解

目录

shell编程之sed

一, 工作原理

二, sed基本语法

三,模式空间中的编辑操作

1, 地址定界

2, 常用编辑命令

3,巧用替换删除内容(不是删除行)

四,sed扩展


shell编程之sed

一, 工作原理

         sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。

按行处理

sed的特点:

(1)sed命令是将一系列的编辑命令应用于一批文本的理想工具。

(2)sed命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输入的文

         本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者

         是管道的文本。

(3)sed命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区(最

         多8192字节),然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行

          进行编辑。重复此过程,一直到所有的文本行都处理完毕。

二, sed基本语法

sed OPTIONS… [SCRIPT] [INPUTFILE…]

 常用的选项:

 -n,--quiet,--silent:不输出模式空间中的内容,使用安静模式,在一般sed的用法中,所有来自 STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被 列出来;

 -i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;

-e:直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开; sed -e 'command1;command2... filename 或者 sed -e 'command1' -e 'command2' ……filename

 -r:使用扩展正则表达式;

-f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。

三,模式空间中的编辑操作

1, 地址定界

1,    ##为数字,指定要进行处理操作的行;1,表示第一行;

(1),打开文本文件

[root@wangjingjing 0203]# vim sed_text.txt

(2),编写文本文件

Hello

World

SHELL

Xian

welcome

expression

environment

interesting

amazing

(3),打印sed_text.txt文件的第三行,(模式空间的内容也打印出来)

[root@wangjingjing 0203]# sed '3p' sed_text.txt

Hello

World

SHELL

SHELL

Xian

(4)只打印sed_text.txt文件的第三行(-n   经过命令处理的行,模式空间内容不打印)

[root@wangjingjing 0203]# sed -n '3p' sed_text.txt

SHELL

2   $:表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;

打印sed_text.txt文件的最后一行

[root@wangjingjing 0203]# sed -n '$p' sed_text.txt

Xian

3    /regexp/:表示能够被regexp匹配到的行;

打印sed_text.txt文件中以S开头的行

[root@wangjingjing 0203]# sed -n '/^S/p' sed_text.txt

SHELL

4   /  正则表达式 /I(大写字母i):匹配时忽略大小写

打印sed_text.txt文件中以s(小写)开头的行,匹配到了SHELL

[root@wangjingjing 0203]# sed -n '/^s/Ip' sed_text.txt

SHELL

5 \%regexp%: 任何能够被regexp匹配到的行,换用%(用其他字符也可以,如:#)为边界符号;

打印sed_text.txt文件中以S开头的行,正则表达式里将"/"换为"%"

[root@wangjingjing 0203]# sed -n '\%^s%Ip' sed_text.txt

SHELL

6 addr1,addr2:指定范围内的所有的行

打印sed_text.txt文件中的2-3行

[root@wangjingjing 0203]# sed -n '2,3p' sed_text.txt

World

SHELL

7  first~step:指定起始的位置及步长

打印sed_text.txt文件中从首行开始,步长为1的行

[root@wangjingjing 0203]# sed -n '1~2p' sed_text.txt
Hello
SHELL 
welcome
environment  
amazing

8,addr1,+N:指定行以及以后的N行;

打印sed_text.txt文件中第一行,以及第一行后面两行

[root@wangjingjing 0203]# sed -n '1,+2p' sed_text.txt

Hello

World

SHELL

 

9   addr1,~N:从指定行开始,然后结束到给定这个N倍数结束;

1,~2p

2,~2p

指的是:从指定行开始,然后结束到给定这个N的倍数结束

[root@wangjingjing 0203]# sed -n '1,~2p' sed_text.txt
Hello
world
[root@wangjingjing 0203]# sed -n '2,~2p' sed_text.txt
world
SHELL 
Xian

注意事项:

1、如果没有指定地址,表示命令将应用于每一行

2、如果只有一个地址,表示命令将应用于这个地址匹配的所有行

3、如果指定了由逗号分隔的两个地址,表示命令应用于匹配第一个地址和第二地

      址之间的行(包括这两行)

4、如果地址后面跟有感叹号,表示命令将应用于不匹配该地址的所有行

1、如果没有指定地址,表示命令将应用于每一行

[root@wangjingjing 0203]# sed -n p sed_text.txt

Hello

World

SHELL

Xian

welcome

expression

environment

interesting

amazing

2,如果地址后面跟有感叹号,表示命令将应用于不匹配该地址的所有行

打印sed_text.txt文件除了前3行所有的行

[root@wangjingjing 0203]# sed -n '1,3!p' sed_text.txt
Xian
welcome
expression  
environment   
interesting  

2, 常用编辑命令

1   d:删除匹配到的行

在模式空间中删除匹配到的行,文件里的行还在

[root@wangjingjing 0203]# sed '2d' sed_text.txt

Hello

SHELL

Xian

welcome

expression

environment

interesting

amazing

-i    对原文件进行修改

删除sed_text.txt文件中的第九行

[root@wangjingjing 0203]# sed -i '9d' sed_text.txt

[root@wangjingjing 0203]# cat sed_text.txt

Hello

World

SHELL

Xian

welcome

expression

environment

interesting

2   p:打印当前模式空间内容

打印第二行

[root@wangjingjing 0203]# sed -n '2p' sed_text.txt

World

原文件没有修改

3,        a \textappend,表示在匹配到的行之后追加内容

在sed_text.txt文件中第一行后面(第二行)追加China

[root@wangjingjing 0203]# sed '1a \China' sed_text.txt

Hello

China

World

SHELL

Xian

welcome

expression

environment

interesting

4,       i \textinsert,表示在匹配到的行之前追加内容

在sed_text.txt文件中第一行前面(第0行)追加China

[root@wangjingjing 0203]# sed '1i \China' sed_text.txt

China

Hello

World

SHELL

Xian

welcome

expression

environment

interesting

5,        c \textchange,表示把匹配到的行和给定的文本进行交换

在sed_text.txt文件中第一行Hello换成China

[root@wangjingjing 0203]# sed '1c \China' sed_text.txt
China
world
SHELL 
Xian
welcome
expression  
environment   
interesting  

6,        s/regexp/replacement/flages:查找替换,替换regexp匹配到的内容

把第一行的Hello 换成Hi

[root@wangjingjing 0203]# sed '1s@Hello@Hi@' sed_text.txt

Hi

World

SHELL

Xian

welcome

expression

environment

interesting

 

常用的flages:

(1)g:全局替换,默认只替换第一个

把第一行中的hi全部替换为hello

[root@wangjingjing 0203]# sed '1s@hi@hello@g' sed_text.txt

hello hello hello hello

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

 

 

(2)i: 不区分大小写

把第一行中的hi(i) 全部(g)替换为hello并打印出来(p)

[root@wangjingjing 0203]# sed -n '1s@HI@hello@gpi' sed_text.txt

hello hello hello hello

 

(3)p:如果成功替换则打印

把第一行中所有的hi替换成hello打印出来(只显示处理行)

[root@wangjingjing 0203]# sed -n '1s@hi@hello@gp' sed_text.txt

hello hello hello hello

把第一行中所有的hi替换成hello打印出来(模式内容与处理行一起打印)

[root@wangjingjing 0203]# sed '1s@hi@hello@gp' sed_text.txt

hello hello hello hello

hello hello hello hello

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

7,         r 读入文件内容追加到匹配行后面

(1)编辑文件append_content.txt

[root@wangjingjing 0203]# vim append_content.txt

(2)将append_content.txt文件追加到sed_text.txt第一行后面

[root@wangjingjing 0203]# sed '1r append_content.txt' sed_text.txt 

hi hi hi hi

append

append1

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

8    R 读入文件一行内容追加到匹配行后面

将append_content.txt文件的第一行追加到sed_text.txt第一行后面

[root@wangjingjing 0203]# sed '1R append_content.txt' sed_text.txt 

hi hi hi hi

append

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

9y     y/source/dest/ 固定长度替换,要求替换的字符串长度相等

把第一行中的hi 换为ha

[root@wangjingjing 0203]# sed '1y/hi/ha/' sed_text.txt 

ha ha ha ha

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

10,            w /path/to/somefile:将匹配到的文件内容追加到指定的文件末尾

将sed_text.txt  文件中的前三行覆盖文件append_content.txt

[root@wangjingjing 0203]# sed '1,3w append_content.txt' sed_text.txt 

hi hi hi hi

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

查看修改后的append_content.txt内容

[root@wangjingjing 0203]# cat append_content.txt

hi hi hi hi

ya ya ya ya

World

11   sed '1 s/north/hello/2' datafile --只替换第一行第二个

把第一行第二个原来的hi 换为Hello

[root@wangjingjing 0203]# sed '1s/hi/Hello/2' sed_text.txt

hi Hello hi hi

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

 

 

3,巧用替换删除内容(不是删除行)

1,   给每一行开头增加#

(1)        \(.*\)表示分组1的内容即匹配所有内容;在分组1前面加上#

[root@wangjingjing 0203]# sed 's/^\(.*\)/#\1/' sed_text.txt

#hi hi hi hi

#ya ya ya ya

#World

#SHELL

#Xian

#welcome

#expression

#environment

#interesting

(2)   &表示前面要替换的所有内容分,即在所有内容前加#

[root@wangjingjing 0203]# sed 's/^.*/#&/' sed_text.txt

#hi hi hi hi

#ya ya ya ya

#World

#SHELL

#Xian

#welcome

#expression

#environment

#interesting

2,   sed 's/^.//' datafile --删除每行第一个字符

(1)  打开文本文件sed_text.txt

[root@wangjingjing 0203]# vim sed_text.txt

(2) 编辑文本内容

#hi hi hi hi

#ya ya ya ya

#World

#SHELL

#Xian

#welcome

#expression

#environment

#interesting      

(3).表示单个任意字符,把每行开始任意一个字符换成空

[root@wangjingjing 0203]# sed 's/^.//' sed_text.txt

hi hi hi hi

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

3, sed 's/^\//' datafile --删除每行第一个单词

\< 单词词首      \>单词词尾

(1)打开文本文件sed_text.txt

[root@wangjingjing 0203]# vim sed_text.txt

(2)编辑文本内容

#hi hi hi hi

#ya ya ya ya

#World

#SHELL. shell

#Xian!   xian

#welcome?   welcome

#expression  expression

#environment   environment

#interesting  interesting

(3) 删除每行的第一个单词

[root@wangjingjing 0203]# sed 's/^\<\w*\>//' sed_text.txt

 hi hi hi

 ya ya ya



. shell

!   xian

?   welcome

  expression

   environment

  interesting

四,sed扩展

1,   ! 对指定行以外的所有行应用命令

除了第一行,打印全文

[root@wangjingjing 0203]# sed -n '1!p' sed_text.txt

ya ya ya ya

World

SHELL

Xian

welcome

expression

environment

interesting

2,    = 打印当前行行号

[root@wangjingjing 0203]# sed -n  '1!p;=' sed_text.txt

1

ya ya ya ya

2

World

3

SHELL

4

Xian

5

welcome

6

expression

7

environment

8

interesting

9

3,   {} 对单个地址或地址范围执行批量操作

对第一行进行1操作和2操作,{} 内是一个整体

[root@wangjingjing 0203]# sed -n  '1{p;=}' sed_text.txt

hi hi hi hi

1

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值