黑帽联盟

标题: Linux centos7 sed命令学深一点 [打印本页]

作者: 定位    时间: 2024-8-26 00:29
标题: Linux centos7 sed命令学深一点
本文详细介绍了sed命令,包括如何在sed中引入变量,以及如何使用w(写文件)、r(读文件)和c(替换)命令进行行处理。重点讲解了模式空间和保持空间的概念,并通过实际案例演示了如何利用这些特性交换文件中的行内容。

相关链接:https://bbs.cnblackhat.com/thread-3119-1-1.html(sed的常用选项

sed命令是流编辑器,对文件中的行一一处理,得到需要的结果。可增删改查文件,把处理后的数据重定向到新文件,或修改原文件。


在sed命令中引入变量、行处理、模式空间与保持空间是本文的重点。其中为了讨论方便,还引入了sed命令中的写文件与读文件。


一、sed中引入变量
我们先定义一些变量,在sed中使用。


sed命令中引入变量,共有三种方法。


1.命令使用单引号
sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量):


sed  '3s/test/'"$i"'/' /home/zhang3/a1.txt


2.命令使用双引号
sed命令中使用双引号的情况下,直接使用变量。


sed "4s/demo/$i/" /home/zhang3/a1.txt


3.添加eval命令
使用单引号,变量直接引用,但是需要通过eval执行这个sed命令。eval会对后面Shell命令进行两遍扫描,如果第一遍扫描后,Shell命令是个普通命令,则执行此命令;如果Shell命令是含有变量的间接引用,则保证间接引用的语义。


命令行可以测试:


name=lisi


eval sed -i 's/games/${name}/g' passwd


1.png


二、sed中读写文件
1.w文件
sed支持写文件命令。命令为单字母w,是write的缩写。


sed w命令用于将模式缓冲区的内容存储在另一文件中。


w语法


[address1[,address2]]w file


file是目标文件路径,也就是内容要备份/拷贝到的目标文件地址。


address1和 address2分别是 起始地址和结束地址,可以是行号或模式字符串。


address1和address2都是可选参数,可不填,这时候就是全文件拷本/备份了。


如果存在一个参数,那么就是备份单行。也就是只备份address1指定的那行。


如果file参数指定的文件不存在,sed会新建文件。


如果file参数指定的文件已经存在,sed会删除原内容。


案例


sed '3w line3' passwd


把文件passwd的第3行内容写入新文件line3中
2.png




sed '2,5 w demo.txt' passwd


把文件passwd的第2-5行内容写入demo文件中
3.png




sed '4,$w file.txt' passwd


把文件passwd的第4至最后一行内容写入file文件中
4.png




注意:


此处,$代表最后一行


w与文件名之间要有空格


起始地址和结束地址与w之间有没有空格都可以。


2.r文件
r 是读文件命令


r 是read 的缩写,后者翻译为中文是读取的意思。


r 命令的使用语法格式如下


[address1[,address]]r file


address1 和 address2 用于行寻址,可以是行号或者模式。


写入文件可以是一行或多行,但读文件最好是某一行之后:


sed -n '2r demo.txt' passwd
5.png




如果用多行,将多次写同样的文件。重复!


sed -n '2,5r line3' passwd
6.png




3.c修改行
c是替换命令


sed提供了单字母命令 c用来完成变更或替换的操作。


c 是change的首字母,后者是变更的意思。


这里的变更或替换并不是替换几个字符,而是把符合条件的行替换为新行。


如果指定的条件是行范围,则会把从开始行到结束行都替换为新行。


单字母命令 c 的语法格式如下


[address1[,address2]] c Replace text


address1 和 address2 是行寻址的开始行和结束行


行寻址是一行,变更或替换的是一行


行寻址是区间,将把所有区间的行变更或替换为一行


变更或替换的,可以是字符串,也可以是变量,也可以是shell命令。


多行替换为一行字符串
7.png




多行用变量替换为一行字符串
8.png




多行用shell命令替换为一行字符串
9.png




三、保持空间
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:模式空间(pattern space)和保持空间(hold space)。


模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理,用于处理文本行。


保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域,用于保留文本行,是保存已经处理过的输入行,默认有一个空行。


与模式空间和保持空间相关的命令:


h 把模式空间的内容复制到保留空间,覆盖模式


H 把模式空间的内容追加到保留空间,追加模式


g 把保留空间的内容复制到模式空间,覆盖模式


G 把保留空间的内容追加到模式空间,追加模式


x 将暂存空间的内容于模式空间里的当前行互换。



四、应用案例
我们先准备一个10行的测试文件passwd
10.png




我们案例与实践是:把文件中的2和5行交换一下,内容调换


1.变量方法
我们先把两行分别定义一个变量,在相应行中替换变量,达到交换行内容的目的。


把第2行和第5行各定义为一个变量line2 line5
11.png




我们把第2行替换为变量line5的值,把第5行替换为变量line2的值


sed -e "2c $line5" -e "5c $line2" passwd
12.png




执行后达到要求。


2.读写文件方法
我们先把两行分别写到一个文件中,在相应行中读取文件,达到交换行内容的目的。


把第2行和第5行各写为文件line2.txt 和line5.txt


sed -e '2w line2.txt' -e '5w line5.txt' passwd
13.png




我们把第2行读取文件line5.txt,把第5行读取文件line2.txt。


在读取文件前,两行都需要先删除本行内容。
14.png




3.借助保持空间方法
因为sed是按行读取的,第2行处理时,是不能借用后面各行内容的。而前面行的内容可以传递到保持空间而暂时保存数据的。


第2行内容先传递到保持空间,再替换为变量line2或读取文件line5.txt或执行shell命令


第5行内容可以把保持空间的数据交换回来。最终达到交换两行内容的目的。


15.png


文章转载自:https://blog.csdn.net/qq_36142959/article/details/132119712





欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5