• shell三剑客之sed


    背景

    sed(Stream Editor 流编辑器),作为三剑客的一份子,主要的功能有增删改查。为什么称之为“流”编辑器呢?大家知道:在Linux文件系统中,一切都可以作为文件来处理,比如:配置文件、设备文件、日志等等。sed就类似于工厂流水线作业的车间一样,文件中的每行内容都是生产元件,经过sed车间流水线处理,最终会变成成品。

    sed语法格式

    同grep一样,sed提供两种方式:

    • stdout | sed [option] “pattern command”
    • sed [option] “pattern command” file

    第一种是从文本中直接使用pattern匹配搜索
    第二种是从标准输出中处理

    语法格式 解释
    option 选项
    pattern 匹配到对应的内容(找谁?)
    command 执行操作/命令,增删改查等(做啥?)

    选项

    选项 含义
    -n 只打印模式匹配的行
    -e 指定对应的模式命令,如果只要一个不需要指定
    -r 在模式中使用扩展正则表达式
    -i 直接修改文件内容

    pattern匹配模式

    匹配模式 含义
    10 command 匹配到第10行
    10,20 command 匹配从第10行开始,到第20行结束
    /pattern1/ command 匹配到pattern1的行
    /pattern1/,/pattern2/ command 匹配到pattern1的行开始,到匹配到pattern2的行结束
    10,/pattern1/ command 匹配到从d第10行开始,到匹配到pattern1的行结束
    /patttern1/,10 command 匹配到pattern1的行开始,到第10行匹配结束

    sed命令-增加&删除

    类别 编辑命令 含义
    增加 a 行后追加(append)
    增加 i 行前追加(insert)
    删除 d 删除

    练习:
    单行插入

    sed '5a lemonban' test.txt
    

    多行插入

    # 
    表示换行符 
    sed '5i hello
    lemonban' test.txt
    

    删除内容

    #删除文件所有内容(不指定匹配模式,默认会匹配到所有行)
    sed 'd' test.txt 
    #删除文件第二行内容
    sed '2d' test.txt 
    

    sed命令-修改

    类别 编辑命令 含义
    修改 s#old#new# 将行内第一个old替换为new
    修改 s#old#new#g 将行内全部的old替换为new
    • “#”作为定界符,“/”也可以作为定界符,当替换内容有包含定界符时,需要进行转义
    • 如果要修改文件内容,需要加“-i”参数

    练习:
    修改文件内容,不对源文件起效

    #将文件中的lemonban替换成lemon
    sed 's#lemonban#lemon#g' person.txt 
    

    修改源文件内容

    #将文件中的lemonban替换成lemon
    sed -i 's#lemonban#lemon#g' person.txt 
    

    修改文件指定行对应的内容

    #将文件中第二行的lemonban替换成lemon
    sed -i '2s#lemonban#lemon#g' person.txt 
    

    sed分组替换功能

    正则表达式中的分组功能sed也是可以支持的,用()记住正则表达式的一部分,其中,1为第一个小括号里面的内容,如果还有其他的下括号,那么2即可第二个,以此类推...,最多记住9个。
    实例:
    I am yy teacher.这串文本想要保留yy,删除剩余的部分

    echo "I am yy teacher." | sed -r 's#I am ([a-z]+) teacher.#1#g'
    

    给配置文件中某一项配置加注释

    sed -r 's#(^test)##1#' file
    

    sed命令-查询

    查询相比较是最简单的,sed中的查询相比cat、more命令可以更加精细,例如:
    查询文件第二行内容(p即表示查询)

    sed -n '2p' test.txt
    

    查询文件1-10行

    sed -n '1,10p' test.txt
    

    注意:p查询命令需要和-n参数结合一起使用,如果不使用-n 会输出原来行内容及匹配行的内容,-n表示取消原来行输出

    综合实例

    用sed取出Linux网卡eth0的IP地址

    ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#1#gp'
    

    将/etc/passwd文件中非单词字符替换成空格

    sed -r 's#[^a-zA-Z]+# #g' /etc/passwd
    

    问题?使用单引号or双引号区别?

    • 双引号
      把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为命令或变量或$(命令或变量)。
    • 单引号
      所见即所得,将单引号内的内容原样输出,阻止所有字符的转义。
  • 相关阅读:
    公号文章模板
    css 网格线
    刷题笔记-图-图的存储
    PAT Advanced A1021 Deepest Root (25) [图的遍历,DFS,计算连通分量的个数,BFS,并查集]
    PAT Advanced 1013 Battle Over Cities (25) [图的遍历,统计连通分量的个数,DFS,BFS,并查集]
    PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]
    PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]
    堆排序
    PAT Advanced 1155 Heap Paths (30) [DFS, 深搜回溯,堆]
    PAT Advanced 1098 Insertion or Heap Sort (25) [heap sort(堆排序)]
  • 原文地址:https://www.cnblogs.com/yyoba/p/11677706.html
Copyright © 2020-2023  润新知