美文网首页
shell之sed

shell之sed

作者: IT小池 | 来源:发表于2019-07-14 21:49 被阅读0次

    sed的处理模式是对每一行都进行处理,而且会先输出原行再输出匹配的行:

    1. -n :只打印模式匹配行

    [root@VM_0_14_centos test]# sed -n '/test/p' test.txt
    

    注意:不加 / 就是对每一行都进行处理

    2. -e :直接再命令行进行sed编辑,默认选项

    [root@VM_0_14_centos test]# sed -n -e '/test/p' -e '/TEST/p' test.txt
    

    注意:多个匹配的时候 -e 必须写,一个可以不写
    或者使用 使用扩展正则表达式 -r,如:

    [root@VM_0_14_centos test]# sed -n -r '/test|TEST/p' test.txt
    

    3. -f :编辑动作保存在文件中,指定文件执行

    4. -r :支持扩展正则表达式

    [root@VM_0_14_centos test]# sed -n -r '/test|TEST/p' test.txt
    

    5. -i :直接修改文件内容

    [root@VM_0_14_centos test]# sed -n 's/test/test100/g;p' test.txt
    

    注意:此时不会修改 test.txt 原文件中的test内容,只把匹配到的输出到终端,如果把 -n 缓存 -r 就会直接修改原文件,如下:

    [root@VM_0_14_centos test]# sed -i 's/test/test100/g' test.txt
    

    sed编辑命令

    查询

    p 打印

    1. 打印 test.txt 的 13 行
    [root@VM_0_14_centos test]# sed -n '13p' test.txt
    
    1. 打印 test.txt 的 第 8 行开始,到第 13 行结束的内容
    [root@VM_0_14_centos test]# sed -n '8,13p' test.txt
    
    1. 打印 test.txt 的 第 8 行开始,然后 +5 行结束的内容
    [root@VM_0_14_centos test]# sed -n '8,+5p' test.txt
    
    1. 打印 test.txt 的 开头匹配 test 的字符串内容
    [root@VM_0_14_centos test]# sed -n '/^test/p' test.txt
    
    1. 打印 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
    [root@VM_0_14_centos test]# sed -n '/^test/,/^test1/p' test.txt
    
    1. 打印 test.txt 的 包含 test 内容的行开始,到开头到第 5 行结束的内容
    [root@VM_0_14_centos test]# sed -n '/^test/,5p' test.txt
    
    增加

    a 在匹配行后面追加
    1.在 test,txt 文件第 10 行后面追加 ' add test1 '

    [root@VM_0_14_centos test]# sed -i '10a add test1' test.txt
    

    2.在 test,txt 文件第 10 行和第 20 行后面追加 ' add test1 '

    [root@VM_0_14_centos test]# sed -i '10,20a add test1' test.txt
    

    3.在 test,txt 文件所有行中包含 test1 行后面追加 ' add test1 '

    [root@VM_0_14_centos test]# sed -i '/test/a add test1' test.txt
    

    i 在匹配行前面追加
    1.在 test,txt 文件每行前面追加 ' add test1 '

    [root@VM_0_14_centos test]# sed -i 'i add test1' test.txt
    

    2.在 test,txt 文件中以 test1 开头的前面行追加 ' add test1 '

    [root@VM_0_14_centos test]# sed -i '/^test1/i add test1' test.txt
    

    r 将文件内容追到加匹配行后面
    1.将 test2.txt 文件的内容追加到 test,txt 文件第 20 行后面

    [root@VM_0_14_centos test]# sed -i '20r /test2.txt' test.txt
    

    2.将 test2.txt 文件的内容追加到 test.txt 文件匹配 test1 后面

    [root@VM_0_14_centos test]# sed -i '/test1/r  /test2.txt' test.txt
    

    w 将匹配行写入外部文件
    1.将 test,txt 文件匹配到的 test1 行追加到 /test2.txt 文件中

    [root@VM_0_14_centos test]# sed -i '/test1/w /test2.txt' test.txt
    

    2.将 test2.txt 文件的内容追加到 test.txt 文件匹配 test1 后面

    [root@VM_0_14_centos test]# sed -i '/test1/r  /test2.txt' test.txt
    
    删除

    d 删除
    删除 test.txt 的第一行

    [root@VM_0_14_centos test]# sed '1d' test.txt
    
    1. 删除 test.txt 的 13 行
    [root@VM_0_14_centos test]# sed -i '13d' test.txt
    
    1. 删除 test.txt 的 第 8 行开始,到第 13 行结束的内容
    [root@VM_0_14_centos test]# sed -i '8,13d' test.txt
    
    1. 删除 test.txt 的 第 8 行开始,然后 +5 行结束的内容
    [root@VM_0_14_centos test]# sed -i '8,+5d' test.txt
    
    1. 删除 test.txt 的 开头匹配 test 的字符串内容
    [root@VM_0_14_centos test]# sed -i '/^test/d' test.txt
    
    1. 删除 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
    [root@VM_0_14_centos test]# sed -i '/^test/,/^test1/d' test.txt
    
    1. 删除 test.txt 的 包含 test 内容的行开始,到开头到第 5 行结束的内容
    [root@VM_0_14_centos test]# sed -i '/^test/,5d' test.txt
    
    1. 删除 test.txt 的中从第 5 行开始,到包含以 test 内容的行开始的内容(推荐
    [root@VM_0_14_centos test]# sed -i '5,/^test/d' test.txt
    
    1. 删除 test.txt 的中从第 5 行开始,到最后行的所有内容
    [root@VM_0_14_centos test]# sed -i '5,$d' test.txt
    
    1. 经典需求)删除 test.txt 的中所有注释(#)空行($)空格([:blank:],这里指#,指#号前的所有空格),三条编辑命令
    [root@VM_0_14_centos test]# sed -i '/^#/d;/^$/d;/[:blank:]*#/d' test.txt
    
    修改

    1. s/pattern/string/ :查找并替换,查找符合pattern模式的字符串,将其替换为string
    2. s/pattern/string/g :g表示全部行内匹配
    3. s/pattern/string/2g :2g表示,同一行内,只替换从第2个开始到剩下所有符合条件的字符串匹配的
    4. s/pattern/string/2 :2g表示,同一行内,只替换前2个,剩下的不替换(3g表示只替换前3个)
    5. s/pattern/string/ig :加i参数表示匹配时忽略大小写,g表示匹配到的全部替换

    替换 test.txt 的中每行的 old 为 new

    [root@VM_0_14_centos test]# sed -i 's/old/new/' test.txt
    
    1. 替换 test.txt 的 1 行的 old 为 new
    [root@VM_0_14_centos test]# sed -i '1s/old/new/' test.txt
    
    1. 替换 test.txt 的 第 8 行开始,到第 13 行结束的内容
    [root@VM_0_14_centos test]# sed -i '8,13s/old/new/' test.txt
    
    1. 替换 test.txt 的 第 8 行开始,然后 +5 行结束的内容
    [root@VM_0_14_centos test]# sed -i '8,+5s/old/new/' test.txt
    
    1. 替换 test.txt 的 开头匹配 test 的字符串内容
    [root@VM_0_14_centos test]# sed -i '/^test/s/old/new/' test.txt
    
    1. 替换 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容的 old 替换成 new
    [root@VM_0_14_centos test]# sed -i '/^test/,/^test1/s/old/new/g' test.txt
    
    1. 替换 test.txt 的 开头为 test 的行开始,到行中包含 test1 的所有行的 old 替换成 new
    [root@VM_0_14_centos test]# sed -i '/^test/,/test1/s/old/new/g' test.txt
    
    1. 替换 test.txt 的 以 test 开始的行,到开头到第 5 行结束的内容
    [root@VM_0_14_centos test]# sed -i '/^test/,5s/old/new' test.txt
    
    1. 替换 test.txt 的 包含 test 内容的行,把 test 替换成 TEST
    [root@VM_0_14_centos test]# sed -i '/test/s/TEST/g' test.txt
    
    其他编辑命令

    = 显示行号

    [root@VM_0_14_centos test]# sed -n '/test/=' test.txt
    
    反向引用

    & 和 \1 引用匹配到的整个串
    在 test.txt 中搜寻以1开头,然后跟两个任意字符,以e结尾的字符串都追加上 r

    [root@VM_0_14_centos test]# sed ‘s/1..e/&r/g' test.txt
    

    注意:在使用 \1 进行匹配替换时,必须把 patten 加上括号(),括号也必须转义,如:

    [root@VM_0_14_centos test]# sed -i ‘s/\(1..e\)/\1r/g' test.txt
    
    sed中引用变量时注意事项:
    1. 匹配模式中存在变量。则建议使用双引号
    2. sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号

    相关文章

      网友评论

          本文标题:shell之sed

          本文链接:https://www.haomeiwen.com/subject/rjzikctx.html