Linux系统三剑客sed及配合正则表达式使用范例。

本文介绍了Linux系统中sed编辑器的工作原理和常用命令,包括sed的非破坏性处理、基本操作如删除、插入、替换等,并通过具体例子展示了如何在文本中查找、替换和处理特定行,以及如何利用正则表达式进行更复杂的文本操作。此外,还提到了sed在多行处理、条件分支和存储空间操作等方面的高级用法。

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

1、sed简介.
sed是一种新型的,非交互式的编辑器。它能执行与编辑器vi和ex相同的编辑人去。sed编辑器没有提供交互式的使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed编辑器没有破坏性,它不会修改文件,除非使用shell重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
2、sed工作过程.
sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕上。sed的命令就是在vi和ed/ex编辑器中见到的那些。sed把当前正在处理的行保存在一个临时缓存区,这个缓存区称为模式空间或临时缓冲。sed处理完模式空间中的行后(即在该行上执行sed命令后),就把该行发送给到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed每处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
sed处理过程如下:
在这里插入图片描述
从上图可以看出sed不是破坏性的,它不i修改正在编辑的文件。
3、sed命令使用.
常用选项:
-n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行。

-e 多重编辑,且命令顺序会影响结果。

-f 指定一个 sed 脚本文件到命令行执行。

-r Sed 使用扩展正则。

-i 直接修改文档读取的内容,不在屏幕上输出

Sed操作命令。

sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址,sed 就会处理输入的所有的行。

x:指定行号。

x,y:指定从x到y的行号范围。

/ pattern/:查询包含模式的行 # # % %。

/ pattern/ pattern/:查询包含两个模式的行。

/ pattern/,x:从与 pattern的匹配行到x号行之间的行。

x,/ pattern/:从x号行到与 pattern的匹配行之间的行。

x,y!:查询不包括x和y行号的行。

r:从另一个文件中读文件。

w:将文本写入到一个文件。

y:变换字符。

q:第一个模式匹配完成后退出。

l:显示与八进制ASCⅡ码等价的控制字符。

{}:在定位行执行的命令组。

p:打印匹配行。

=:打印文件行号。

a:在定位行号之后追加文本信息。

i:在定位行号之前插入文本信息。

d:删除定位行。

c:用新文本替换定位文本。

s:使用替换模式替换相应模式。

n:读取下一个输入行,用下一个命令处理新的行。

N:将当前读入行的下一行读取到当前的模式空间。

h:将模式缓冲区的文本复制到保持缓冲区。

H:将模式缓冲区的文本追加到保持缓冲区。

x:互换模式缓冲区和保持缓冲区的内容。

g:将保持缓冲区的内容复制到模式缓冲区。

G:将保持缓冲区的内容追加到模式缓冲区。

删除:
1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示nl /etc/passwd | sed ‘2,5d’

注: sed是sed-e的简写, 后接单引号

2.同上删除第2行 nl /etc/passwd | sed ‘2d’

3.同上删除第三行到最后一行 nl/etc/passwd | sed ‘3,$d’

4.删除批注行 sed ‘/^#.*/d’ /etc/inittab

5.删除注释以及空白行sed ‘/^#./d’ /etc/inittab|sed '/^\s$/d’

插入 :
1.在第二行后加上一行test nl /etc/passwd | sed ‘2a test’

  1. 在第二行前加上一行test nl /etc/passwd | sed ‘2i test’

  2. 在第二行后加入三行test nl /etc/passwd|sed ‘2attttttt\ndddd\nhhh’

替换:
1.将2-5行内容取代为 No 2-5 number nl /etc/passwd | sed ‘2,5c No 2-5 number’

2.把9.txt 文件中 old 替换为new

Sed ‘s/old/new/g’ 9.txt # s///g 内容替换g全局替换

3.在一行的内容前边添加内容

sed ‘/good/ s/^/&word/g’ 9.txt #<==/good/会匹配特定的内容,然后对匹配到的行进行s/$/&word/g 替换操作 ,&的意思追加

4.在一行的内容后边添加内容

sed '/good/ s/KaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲word/g'9.txt #<…/&word/g 替换操作 ,&的意思追加

打印:

  1. 列出/etc/passwd 内第5-7行 nl/etc/passwd |sed -n ‘5,7p’

查询:
1.获取本机IP的行 /sbin/ifconfigeth0 |grep ‘inet addr’

2.将IP前面的部分予以删除 /sbin/ifconfig
eth0 |grep ‘inet addr’| sed ‘s/^.*addr://g’

3.将IP后面的部分删除
/sbin/ifconfigeth0 |grep ‘inet addr’| sed ‘s/^.addr://g’| sed 's/Bcast:.$//g’ /sbin/ifconfig eth0| sed -n’/^\sinet addr/p’|sed 's/^\sinet addr://g’|sed ‘s/Bcast:.*//g’

4.用grep将关键词MAN所在行取出来 cat
/etc/man.config |grep ‘MAN’

例题:

(1)替换 1.txt文本中old为new,代码如下

sed 's/old/new/g ’   1. txt

(2)打印 1. txt文本第一行至第三行,代码如下

Sed  -n  ‘1,3p’ 
1.txt

(3)打印 1.txt文本中第一行与最后一行,代码如下

Sed -n ‘1p; $p’ 1.txt

(4)删除 1.txt第一行至第三行、删除匹配行至最后一行,代码如下

Sed ‘1,3d’ 1.txt

Sed ‘/aaaa/, $d’ 1.txt

(5)删除 1. txt最后3行及删除最后一行,代码如下:

Sed  ‘$d’  1.txt

[root@localhost songlss]# myfile=9.txt

[root@localhost songlss]# echo $myfile

9.txt

[root@localhost songlss]# A= ( s e d − n ′ (sed -n &#x27; (sedn=’ 9.txt)

[root@localhost songlss]# let line=$A-3+1

[root@localhost songlss]# sed l i n e ′ , line&#x27;, line,d’ $myfile

hhhhhthegfagfvebhrh

thebbsvchbhg

dhggggggthe

ooodsgfgjj

goodsvghfvfrg

ttTHEFGSDViii\nggdgggThe\ngsafgdeffd

ttTHEFGSDViiinggdgggThengsafgdeffd

(6)删除 1.txt最后6行,代码如下:

Sed  ‘$d’ 
1.txt

(7)在 1.txt查找aaa 所在行,并在其下一行添加word字符,a表示在其下一行添加字符串,代码如下:

Sed  ‘/aaa/a word’   1.txt

(8)  
在 1.txt查找bbb 所在行,并在其上一行添加word字符,i表示在其上一行添加字符串,代码如下;

Sed ‘/bbb/i word’  1.txt

7、在 1.txt查找以.test结尾的行,在其行尾添加字符串word,$表示结尾标识,&在sed中表示追加,代码如下

sed ‘/test /   s / /  s/ / s//&word/g’ 1.txt

10、在1.txt查找www的行,在其行首添加字符串word,^表示起始标识,&在sed中表示添加,代码如下

sed  ‘/www/ 
s/^/&word/g’  1.txt

11、多个sed命令组合,使用e参数,代码如下

sed -e ‘/www.jd.com/ s/^/&1./g’  -e ‘s/www.jd.com$/&./g’ 1.txt

(12)多个sed命令组合,使用分号“;"分割,代码如下

Sed  -e  ‘/www.jd.con/s//&1./;s/www.jd.com$/6./g’
1.txt

(13)  
修改 SELinux策略 enforcing为 disabled,查找/ SELINUX/行,然后将其行

(14)  
删除偶数行 sed ‘n;d’
name.txt

(15)  
删除奇数行sed ‘1d;n;d’
name.txt

(16)enforccing值改成 disabled,!s表示不包括 SELINUX行,代码如下:

sed  -i  ‘/SELINUX/  
s/enforcing/disabled/g’    /etc/selinux/config

sed  -i  ‘/SELINUX/! 
s/enforcing/disabled/g’   /etc/selinux/config

通常而言,sed将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执

行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入

直到文件处理完备

如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以

便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行,这时可

以使用sed高级语法来满足用户需求。总的来说,sed高级命令可以分为以下3种功能

N、D、P:处理多行模式空间的问题

H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑

:、a:b、t在脚本中实现分支与条件结构

(1)在1.txt每行后加入空行,也即每行占用两行空间,每一行后边插入一行空行两行空行及前三行每行后插入空行,代码如下

sed  ‘/^ $/d; G’  1.txt

sed  ‘/^ $/d; G; G’  1.txt

sed  '/^ $/d;  1,3G; ’  1.txt

(2)将 1.txt偶数行删除及隔两行删除一行,代码如下:

sed  ‘n; d’   1.txt

sed  ‘n; n; d’  1.txt

(3)在 1.txt匹配行前一行、后一行插入空行以及同时在匹配前后插入空行,代码如下:

sed  ‘/aaa/{x; p; x;}’  1.txt

sed ‘/bbb/G’   1.txt

sed '/bbb/{x; p; x; G;} 1.txt

(4)在jdux每行后加人空行,也即每行占用两行空间,每一行后边插人空行,代码如下:

sed  ‘/^$/d; G’ 1.txt

(5)在jedu.txt每行后加入两行空行,也即每行占用三行空间,每一行后边插入空行代码如下

sed ‘/^ $/d; G;’ 1.txt

(6)在 jiedu.txt每行前加入顺序数字序号、加上制表符“\t”"及“,”符号,代码如下

sed = 1.txt| sed ‘N;  s/\n/ /’

sed = 1.txt| sed ‘N; s/\n/\n/\t’

sed = 1.txt| sed ‘N; s/\n/\ ./’

(7)删除 ifed.txt行前和行尾的任意空格,代码如下

sed ‘s/1* //; s/[ \t] * $//’ 1.txt

(8)打印 fedu. txt关键词old与mew之间的内容,代码如下:

sed -n 'old/,/new/'p 1.txt

(9)打印及删除 ifed.:最后两行,代码如下

sed  ‘$!N; $!D’   1.txt

sed ‘N; $!p; $!D; $d’ 1.txt

(10)合并上,下两行,也即两行合并,代码如下

sed ‘$!N; s/\n/ /’ 1.txt

sed ‘N; s/\n/ /’  1.txt


  1. \t ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值