黑帽联盟

 找回密码
 会员注册
查看: 47|回复: 0
打印 上一主题 下一主题

[资源教程] Linux centos7 sed命令学深一点

[复制链接]

883

主题

38

听众

3276

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情

    1 小时前
  • 签到天数: 1606 天

    [LV.Master]伴坛终老

    本文详细介绍了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
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部