黑帽联盟
标题:
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
2024-8-26 00:22 上传
下载附件
(45.12 KB)
二、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中
2024-8-26 00:22 上传
下载附件
(20.73 KB)
sed '2,5 w demo.txt' passwd
把文件passwd的第2-5行内容写入demo文件中
2024-8-26 00:22 上传
下载附件
(29.43 KB)
sed '4,$w file.txt' passwd
把文件passwd的第4至最后一行内容写入file文件中
2024-8-26 00:22 上传
下载附件
(37.6 KB)
注意:
此处,$代表最后一行
w与文件名之间要有空格
起始地址和结束地址与w之间有没有空格都可以。
2.r文件
r 是读文件命令
r 是read 的缩写,后者翻译为中文是读取的意思。
r 命令的使用语法格式如下
[address1[,address]]r file
address1 和 address2 用于行寻址,可以是行号或者模式。
写入文件可以是一行或多行,但读文件最好是某一行之后:
sed -n '2r demo.txt' passwd
2024-8-26 00:22 上传
下载附件
(20.95 KB)
如果用多行,将多次写同样的文件。重复!
sed -n '2,5r line3' passwd
2024-8-26 00:22 上传
下载附件
(21.61 KB)
3.c修改行
c是替换命令
sed提供了单字母命令 c用来完成变更或替换的操作。
c 是change的首字母,后者是变更的意思。
这里的变更或替换并不是替换几个字符,而是把符合条件的行替换为新行。
如果指定的条件是行范围,则会把从开始行到结束行都替换为新行。
单字母命令 c 的语法格式如下
[address1[,address2]] c Replace text
address1 和 address2 是行寻址的开始行和结束行
行寻址是一行,变更或替换的是一行
行寻址是区间,将把所有区间的行变更或替换为一行
变更或替换的,可以是字符串,也可以是变量,也可以是shell命令。
多行替换为一行字符串
2024-8-26 00:22 上传
下载附件
(35.35 KB)
多行用变量替换为一行字符串
2024-8-26 00:22 上传
下载附件
(32.5 KB)
多行用shell命令替换为一行字符串
2024-8-26 00:22 上传
下载附件
(28.89 KB)
三、保持空间
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:模式空间(pattern space)和保持空间(hold space)。
模式空间
:可以想成工程里面的流水线,数据之间在它上面进行处理,用于处理文本行。
保持空间
:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域,用于保留文本行,是保存已经处理过的输入行,默认有一个空行。
与模式空间和保持空间相关的命令:
h 把模式空间的内容复制到保留空间,覆盖模式
H 把模式空间的内容追加到保留空间,追加模式
g 把保留空间的内容复制到模式空间,覆盖模式
G 把保留空间的内容追加到模式空间,追加模式
x 将暂存空间的内容于模式空间里的当前行互换。
四、应用案例
我们先准备一个10行的测试文件passwd
2024-8-26 00:22 上传
下载附件
(31.59 KB)
我们案例与实践是:把文件中的2和5行交换一下,内容调换
1.变量方法
我们先把两行分别定义一个变量,在相应行中替换变量,达到交换行内容的目的。
把第2行和第5行各定义为一个变量line2 line5
2024-8-26 00:22 上传
下载附件
(16.91 KB)
我们把第2行替换为变量line5的值,把第5行替换为变量line2的值
sed -e "2c $line5" -e "5c $line2" passwd
2024-8-26 00:22 上传
下载附件
(35.27 KB)
执行后达到要求。
2.读写文件方法
我们先把两行分别写到一个文件中,在相应行中读取文件,达到交换行内容的目的。
把第2行和第5行各写为文件line2.txt 和line5.txt
sed -e '2w line2.txt' -e '5w line5.txt' passwd
2024-8-26 00:22 上传
下载附件
(17.29 KB)
我们把第2行读取文件line5.txt,把第5行读取文件line2.txt。
在读取文件前,两行都需要先删除本行内容。
2024-8-26 00:22 上传
下载附件
(39.31 KB)
3.借助保持空间方法
因为sed是按行读取的,第2行处理时,是不能借用后面各行内容的。而前面行的内容可以传递到保持空间而暂时保存数据的。
第2行内容先传递到保持空间,再替换为变量line2或读取文件line5.txt或执行shell命令
第5行内容可以把保持空间的数据交换回来。最终达到交换两行内容的目的。
2024-8-26 00:22 上传
下载附件
(40.59 KB)
文章转载自:https://blog.csdn.net/qq_36142959/article/details/132119712
欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/)
Powered by Discuz! X2.5