sed行编辑器

sed流编辑器,读取一行,对行进行操作

三种运行sed,awk的方式
    1:shell命令
    2:sed option -f sed脚本文件 输入文件
    3:./awk脚本文件 输入文件

sed基础知识

语法     sed option '范围 命令' 文件

sed命令选项(option)及其意义
    -n  不打印所有的行到标准输出
    -e  将下一个的字符串解释为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以省略
    -i  写入到原文本

sed命令通常由定位文本行和sed编辑命令两部分组成,后者对前者定位到的文本进行处理
    sed使用两种方式进行定位
        1:使用行号,指定一行,或指定行号范围
        2:使用正则表达式

sed定位文本的方法
    写法  意义
    5   指定为第5行
    $   表示最后一行
    4,9 指定为第4到第9行
    /pattern/   查询包含模式的行
    /pattern/pattern/   查询包含两个模式的行
    /pattern/,5     匹配pattern到第五行之间的行
    5,/pattern/     匹配第五行到pattern之间的行
    5,10!           匹配不是第五和第10行的行

sed的编辑命令
        d:删除
        s:替换    s/old/new/标签        (标签可以是数字,也可以是g,表示全局)
        也可以是任意字符  s#old#new#    (old部分可以使用正则,new不可以,但是可以使用&,\U,\u,\L,\l,\E)
    替换时的分组(group):在old部分相关位置使用()括起来,在new可以引用,第一个括号可以使用\1 
    sed 's/\(to\)\(m\)/\2/' aa  (将tom分成两组,(to),和(m), 使用\2引用m)(注意括号前的\是转义之用)

        p:打印操作过的行
        a:在指定行的下一行添加一行
        i:在指定行的上一行添加一行
        c:替换,把满足某个条件的行进行替换
            r:从其他文件读入内容       sed '/root/r ifcfg-eth0' /etc/passwd
        y:替换,y/abc/XYZ/ 指凡是见到a边将提换成X,b换成Y,c换成Z
        =:打印文件行号
        n:读取下一行需,要与{}结合使用   sed -n '1{n;p}' aa (打印第二行)  不怎么用到
        N:追加读取一行    sed -n '1{N;p}' aa  (读取第一行,并追加读取一行,打印一二两行,不会覆盖模式空间的第一行)
        这样原本的两行读到模式空间里,只会被看着一行,
            w:匹配的另存为一个文件,后面接新文件名,可以是不存在的
        x:让保持空间和模式空间的数据互换   
        h:将模式空间的内容复制到保持空间
            l:显示控制字符,一些文件中包含控制字符,如退格键,F1,shift键
            {}:在定位处,执行命令组,命令之间用分号隔开,类似于-e

        -n:不显示处理信息

sed写法实例

    sed '5,10d'     (删除5到10行:,表示到,d表示删除,范围用数字,最后一行也可以用$)
    sed '5.$d'      (删除5到最后一行)
    sed '1 ~ 2 d '  (~表示跨步,:表示从第一行开始以跨步为2进行删除,其实就是删除1 3 5 7 9行)
    sed '2 ~ 2 d '  (以二开始,跨步为二开始删除,其实就是删除2 4 6 8 行)

    若要使用正则表达式,要用//引起来或者 ##引起来
    sed -n '/\/$/p'     (匹配以特殊字符结尾的行,这里是匹配 以/结尾的行)
    sed '/tom/d'        (删除包含tom的行)
    sed '/^tom/,/tom$/d'    (删除以tom开头到tom结尾的行)
    sed '/\btom\b/d'    (删除包含单词tom的行,\b\b表示单词)
    sed '/tom\d+/d'

    sed '2y/to/XY/'         (将第二行的t换成X,o换成Y)
    sed 's/tom/TOM/'        (将tom替换成TOM,注意默认只替换第一个)
    sed 's/tom/---&--/g'    (将tom替换成--tom--,这里&指的是tom)      特殊
    sed 's/tom/yyy\Uyyy/g'  (将tom替换成yyyYYY),\U表示后面的全部大写 特殊
    sed 's/tom/yyy\Uyy\Ey/g'(将tom替换成yyyYYy),\U表示后面的全部大写,\E表示终止  特殊
    sed 's/tom/yyy\uyyy/g'  (将tom替换成yyyYyy),\u表示后面第一个字符大写   特殊
    sed 's/tom/YYY\LYYY/g'  (将tom替换成YYYyyy),\L表示后面的全部小写 特殊
    sed 's/tom/YYY\LYYY/g'  (将tom替换成YYYyyy),\L表示后面的第一个小写    特殊
    sed 's/\[.*\]/\U&/'     (将[]里面的字母全部转换成大写的)  特殊

    sed 's/[tT][Oo]m/TOM/g' (将tom,Tom,TOm,tOm,都替换成TOM),[tT]
    sed 's/tom/TOM/2'       (将每行的第二个tom替换成TOM)
    sed 's/tom/TOM/g'       (将所有的tom替换成TOM)
    sed '4,$s/tom/TOM/g'    (将4到最后一行的tom替换成TOM)
    sed -n 's/tom/TOM/g'    (-n不显示到屏幕上)
    sed -n 's/tom/TOM/gp'   (p打印操作过的行)

    sed '1{s/tom/TOM/g;s/aa/AAA/g}'    (对第一行进行两次替换,第一次将tom替换成TOM,然后将aa替换成AAA)(用花括号,中间用分号)

    sed '/^ONBOOT/c ONBOOT=YES' ifcfg-eth0      #将ONBOOT这一行都替换成为ONBOOT=YES
    sed '$ a DNS1=211.141.90.68' ifcfg-eth0     #在最后一行的下方添加DNS1=211.141.90.68

    sed '1,$l' /etc/passwd                      #显示控制字符
    sed -n 's/ONBOOT/ONBOOT=yes/p' ifcfg-eth0
    sed -n 's/ONBOOT/ONBOOT=yes/2p' ifcfg-eth0  #替换该行第二次匹配到的内容
    sed '/root/r ifcfg-eth0' /etc/passwd        #在root所在行的下面,写入ifcfg-eth0文件的内容
    sed '/root/{s/t/T/g;s/ro/RO/g}' /etc/passwd #在匹配到root的行里面,将所在行的t变成大写T,ro变成RO

sed高级用法及注意事项

sed分割多个编辑命令的方法
    1:-e        sed -e '5d' -e '/root/d' /etc/passwd
    2:{}        sed '1{s/r/R/;s/t/T/}' /etc/passwd
    3:使用分号; sed 's/r/R/;5d' /etc/passwd

注意:sed 在引用shell变量时 应使用双引号,平时使用单引号
    ip=$1
    sed  "/IPADDR/c IPADDR=$ip" eth0

注意:所有操作都不会影响改变源文件,只有当其使用-i参数,才会将修改写进源文件
    sed -i '2,$d' aa 
    sed -i.bak '2,$d' aa    #在写进源文件之前,将源文件以原名字aa.bak结尾的备份一次,并修改当前文件
    注意:如果想用sed修改源文件的话,不要使用-n 和p操作
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/440.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/5/15作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录