10.非交互式的文本编辑器sed

sed可以非交互式的修改文本,逐行操作


sed的命令格式:
    前置命令 | sed 选项 '定位符+指令'        或者        sed 选项 '定位符指令' 文本文件
        例如:
        df -h | sed -n 'p'    
            #这就是把df -h的内容再输出一遍
        sed 'p' 2.txt
    指令:
        一般指令:
            删除整行d,修改字符s,查整行p,行后追加a,行前追加i,替换目标行c
        特殊指令
            '=' 显示文本中所有行的行号,例如:sed -n '=' 2.txt
            '$=' 显示最后一行的行号,例如:sed -n '$=' 2.txt 这里的$代表最后一个,也可以与其他字符一起使用,代表最后匹配的字符
        
    常用选项:
        -n 屏蔽默认输出,这个是一定要加的
        -r 支持扩展正则
        -i 写入文件,不加这个选项就只是查看文本,可以不加i先测试
    
    一般指令详解:所有的指令需要用''括起来
        p 
            查行,并输出指定内容,通常与选项 -n 一起使用
                例如:
                    sed -n 'p' 2.txt    #指令p需要-n屏蔽默认输出,因为sed不管用了哪个指令,都会输出一遍默认输出,再有p的输出,就成了两次输出了
                                        
                查并输出这个文本的第二行:
                    sed -n '2p' 2.txt    #p前面加数字就是输出第几行
                        
                查并输出这个文本的1到3行:
                    sed -n '1,3p' 2.txt    #用,表示连贯,输出两者都满足的行
                        
                查并输出这个文本第1行,然再额外看后面两行:
                    sed -n '1,+2p' 2.txt    #想多看1行,就是+1p
                        
                查并输出这个文本第1行和第3行:
                    sed -n '1p;3p' 2.txt
                
                查并输出这个文本第1行,然后再输出第 1+2行,1+2+2,1+2+2+2,1+2+2+2+2 ....直至文本结束,也就是1 3 5 7行
                    sed -n '1~2p' 2.txt
                
                查找并输出最后一行
                    sed -n '$p' 2.txt
                    
                用正则匹配:
                    sed -n '/正则定位符/p' 文本文件
                    sed -n -r '/扩展正则定位符/' 文本文件
                    例如:
                    sed -n '/^root/p' 2.txt     #找并输出root开头的行
                    sed -n '/haha/!p' 2.txt        #显示不包含haha的行
                    sed -r -n '/[A-Z][a-z]{2}/' 
                    
        
        d    
            删行,不能删单个字符,通常与选项 -i 一起使用(测试时可以先不加-i查看效果),通常不与选项 -n 一起使用,因为d不像p有输出功能
                例如:
                    sed -i 'd' 2.txt            #删文本的第一行,删第几行就是 几d
                    sed -i '2,5d' 2.txt         #删2到5行
                    sed -i '1,+3d' 2.txt        #删第1行,和紧接着后面的3行
                    sed -i '1p;3d' 2.txt        #删第1行,和第3行
                    sed -i '1~3d' 2.txt            #删第1行,1+2 1+2+2 1+2+2 ...直至文本结束
                    sed -i '$d' 2.txt            #删最后一行
                    sed -i '/正则定位符/d' 2.txt    
                        例如:sed '/[rot]/' 2.txt     #删包含rot这3个字母中任意一个字母的行
                    sed -i -r '/扩展正则/d' 2.txt
        
        s
            改字符,通常与选项 -i 一起使用(测试时可以先不加-i查看效果),通常不与选项 -n 一起使用,因为d不像p有输出功能
                例如:
                    cat /mnt/2.txt
                    old old old
                    old old old
                    old old old 
                    
                    sed -i 's/old/new/' 2.txt    #换每行的第1个old,换成new
                    sed -i 's/old/new/2' 2.txt    #看文本中哪行有两个'old',就改这行的第二个'old',如果有多行,则多行都改第2个
                        显示如下
                        old new old
                        old new old
                        old new old
                        
                    sed -i '/^a/s/$/***/' 1.txt            #先找到以a开头的行,别的命令都是在几行,所以s前没体现定位符,然后再进行替换操作,把末尾改成***,这是在末尾直接加,要想改末尾的最后一个字符就是.$
                    
                    sed -i '2s/old/new/' 2.txt            #换第2行的第1个old,第一行可以写1s
                    sed -i '2s/old/new/2' 2.txt            #换第2行的第2个old
                    
                    sed -i 's/old/new/g' 2.txt            #换整个文本中所有old
                    sed -i '2s/old/new/g' 2.txt            #换第2行的所有old
                    sed -i '2,3s/old/new/g' 2.txt        #换第2行到第3行中的所有old
                    sed -i '4s/\^/\#/2' 3.txt            #把第4行的特殊符号^换成特殊符号#
                    sed -i '2s/.//2;/.$//' 2.txt        #把第2行的第2个字符替换为空(就是删除),再把每一行的最后一个字符替换为空
                    sed -i 's/[0-9]//g' 2.txt            #把所有数字全删了
        
                    sed -i '3s/old/new/2;3s/old/new2/2' 2.txt    
                        #换第3行第2个old,和第3个old
                        #为什么;后面这条指令最后还是2,因为你前面一个old改完了,对于sed来说这行的第三个old就变成第二个了,所以这么写
                        显示如下:
                        old old old
                        old old old
                        old new new2
                    
                    sed 中的///这个隔离符可以换成 ! @ # $ % ^ & * ( ) 这些符合都可以做隔离符,比如我们要换一些特殊的字符串如/bin/bash 就可以换个隔离符,不用///,不然会报错 
                    
                    s还可以与 p 和 -n 一起使用,只显示替换成功的行:
                        sed -i -n '3s/old/new/2p' 2.txt    
                    
                    sed -i -r '1s/(oo){2}//' /etc/passwd    #把第一行的第一组oo换成空
                s的调换功能:
                    cat 1.txt
                    ah sdahpp ah
                        我要把第二组ah的 a 和 h 调换位置,变成 ha
                            sed -r -i '1s/(a)(h)/\2\1/2' 1.txt
                        将第一行的首字符和尾字符调换
                            sed -r -i '1s/^(.)(.*)(.)$/\3\2\1/' 1.txt
                                #因为这属于是匹配上一整行了,所以没必要再告诉sed替换第几个字符了
                                #不想要1了,不写就会删掉
                        给文档中所有的小写字母套上[]
                            sed -r -i '1s/([a-z])/[\1]/g' 1.txt
        
        a 
            在指定行的下面,新起一行追加内容,想实际生效,需要与 -i 一起使用,定位目标行的方法参考p
            sed 'a 888' 1.txt            #在每一行下面新起一行追加内容
            sed '/^a/a haha' 1.txt        #先定位a开头的行,然后在这行下面新起一行,写haha
            sed '1,3a 888' 1.txt        #第1一直到第3行,这些行下面都追加
                    
        i
            在指定行的上面,新起一行追加内容,定位目标行的方法参考p

        c 
            替换行,定位目标行的方法参考p
            sed '1c 888' 1.txt        #把第一行替换成888
        
                    
基于sed用法编写一个判断yum仓库是否可用的脚本:
#!/bin/bash
a='0'
b=$(yum repolist | sed -n '$p')            #repolist在最后一行,让sed输出最后一行
c=$(echo ${b##* } | sed '1s/,//')        #字符串处理,把b中的空格和空格以前内容全删了,只要数字和逗号,再交给sed把逗号删了,就剩数字了
if [[ $a == $c ]];then                    #俩[],假如参数c中有特殊符号,单括号就报错了,没有的话俩括号也没毛病,所以条件测试[[]]最稳
  echo '你yum仓库坏了'
else
  echo '你yum仓库没毛病'
fi
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值