正则表达式--------SED

本文详细介绍了sed流编辑器的基本概念、常用选项及命令。sed作为一种强大的文本处理工具,能够高效地实现文件内容的筛选、替换及格式转换等功能。文章通过实例展示了如何使用sed进行文本模式匹配、行删除及插入等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、sed简介

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。

sed默认的工作模式是basic模式。

sed命令行的基本格式为:
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...

sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传 入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文 件然后用-f参数指定,编辑命令的格式为
/pattern/action


其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行 与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


二、sed的选项、命令


选项

-e<script>或--expression=<script> 允许多台编辑,以选项中指定的script来处理输入的文本文件。
-h,--help 打印帮助,并显示bug列表的地址。
-n,--quiet,--silent 取消默认输出,仅显示script处理后的结果。
-f<script>或--file=<script> 以选项中指定的script文件来处理输入的文本文件。
-V,--version打印版本和版权信息。
-r : sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语令)
sed的替换选项
g 表示行内全面替换。 
p 表示打印行。 
w 表示把行写入一个文件。 
x 表示互换模板块中的文本和缓冲区中的文本。 
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式) 
\1 子串匹配标记 
& 已匹配字符串标记


命令


     a\ 在当前行下面插入文本。


     i\ 在当前行上面插入文本。


     c\ 把选定的行改为新的文本。

    

      d 删除,删除选择的行。

 

     D 删除模板块的第一行。


     s 替换指定字符 


     h 拷贝模板块的内容到内存中的缓冲区。

 

     H 追加模板块的内容到内存中的缓冲区。

 

     g 获得内存缓冲区的内容,并替代当前模板块中的文本。

 

     G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。

 

     l 列表不能打印字符的清单。 


     n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

 

     N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

 

     p 打印模板块的行。

 

     P(大写) 打印模板块的第一行。

 

     q 退出Sed。

 

     b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

 

     r file 从file中读行。 


     t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

 

     T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 


     w file 写并追加模板块到file末尾。 


     W file 写并追加模板块的第一行到file末尾。 


     ! 表示后面的命令对所有没有被选定的行发生作用。

 

     = 打印当前行号码。 


     # 把注释扩展到下一个换行符以前。  


sed用法示例


1. /pattern/p :打印匹配pattern的行

使用p命令需要注意,sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令 表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。



2. /pattern/d :删除匹配pattern的行

 

3. /pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配
pattern1的字符串替换为pattern2


4. /pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配
pattern1的字符串替换为pattern2




pattern2中的\1表示与pattern1的第一个()括号相匹配的内容,\2表示与pattern1的第二个()括号相匹配的内容。sed默认使用Basic正则表达式规范,如果指定了-r选项则使用Extended规范,那么()括号就不必转义了。

5、定址:用于对哪些行进行编辑。

sed -n ‘3p’ file #打印第三行
sed -n ‘100,300p’ file #打印100〜~300⾏行的信息(包括100和300)
地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两⾏行在内)。范围可以用数字、正则表达式、或二者的组合表示。
sed ‘2,5d’ file #删除第二行到第五行
sed ‘/start/ ,/end/d’ file #删除包含’start’行和’end’行之间的行
sed ‘/start/, 10d’ file #删除包含’start’ 的行到第十行的内容


保持空间和模式空间


模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。

而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:

+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
+ G:[address[,address]]G 将hold space中的内容append到patternspace\n后
+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
+ H:[address[,address]]H 将pattern space中的内容append到holdspace\n后
+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中
+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
+ x:交换保持空间和模式空间的内容


☆☆☆ 在每行结尾后添加一个空行

[root@localhost SED]# sed 's/$/\n/' file 
1

2

3

4

5

6

7

8

9

[root@localhost SED]# sed 'G' file  //利用保持空间
1

2

3

4

5

6

7

8

9


☆☆☆ 倒序输出

[root@localhost SED]# sed '1!G;h;$!d' file
9
8
7
6
5
4
3
2
1


☆ 追加匹配行到文件结尾

<span style="color:#333333;">[root@localhost SED]# sed -e '/hello/H' -e '$G' file
we youth
hellobit
hello youngyoungla

hellobit
hello youngyoungla</span><span style="color:#6600cc;">
</span>

☆ 行列转化




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值