sed命令

作者: aq_wzj | 来源:发表于2019-11-04 12:45 被阅读0次

    原文地址: https://www.jianshu.com/p/89163e927a2c

    0. 目录

    1.简介
    2.子命令
        2.1 p--输出
        2.2 i--插入行
        2.3 a --追加行
        2.4 d删除行
        2.5 c替换行
        2.6 s替换指定文本

    1. 子命令组合

    1. 简介

    在命令行对文本进行操作, 如替换某文字, 插入文字, 删除文字等

    语法格式

    sed [options] commands [inputfile...]
    

    commands会包含一些子命令,如p代表打印ia代表插入和追加,d代表删除行c代表替换行s代表替换单词

    option包含的一些选项及其作用如下

    选项名 作用
    -n 取消默认输出
    -e 多点编辑,可以执行多个子命令
    -f 从脚本文件中读取命令(sed操作可以事先写入脚本,然后通过-f读取并执行)
    -i 直接编辑原文件
    -l 指定行的长度
    -r 在脚本中使用扩展表达式

    测试文本
    root@wzj-dev:/opt# cat test1.txt

    letitia
    mail
    uuencode
    1003605091
    01566
    

    sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。

    以下实验均为缓冲区操作,未改变源文件

    2. 子命令

    2.1 p--输出

    2.1.1 打印1-3行

    root@wzj-dev:/opt# sed '1,3 p' test1.txt
    letitia
    letitia
    mail
    mail
    uuencode
    uuencode
    1003605091
    01566
    

    因为未加-n选项,所以除了打印第1-3行外, 还有个默认打印, 导致第1-3行打印两遍

    root@wzj-dev:/opt# sed -n '1,3 p' test1.txt 
    letitia
    mail
    uuencode
    

    2.1.2 正则 --打印ma开头的那一行到最后一行

    root@wzj-dev:/opt# sed -n '/^ma/,$ p' test1.txt
    mail
    uuencode
    1003605091
    01566
    

    2.1.3 设置步长--- 第一行开始,行号递增2输出

    root@wzj-dev:/opt# sed -n '1~2 p' test1.txt
    letitia
    uuencode
    01566
    

    2.2 i--插入行

    在第二行前插入一行insert111字符串

    #-e选项表示多个子命令,本例执行i子命令之后执行了p子命令
    root@wzj-dev:/opt# sed -n -e '2 i insert111' -e '1,4 p' test1.txt 
    letitia
    insert111
    mail
    uuencode
    1003605091
    

    2.3 a --追加行

    在第二行之后追加一行append111字符串

    root@wzj-dev:/opt# sed -n -e '2 a append111' -e '1,4 p' test1.txt
    letitia
    mail
    append111
    uuencode
    1003605091
    

    2.4 d删除行

    删除第二行

    root@wzj-dev:/opt# sed -n -e '2 d' -e '1,$ p' test1.txt
    letitia
    uuencode
    1003605091
    01566
    

    2.5 c替换行

    将第二行的mail替换为newmail

    root@wzj-dev:/opt# sed -n -e '2 c newmail' -e '1,$ p' test1.txt
    letitia
    newmail
    uuencode
    1003605091
    01566
    

    2.6 s替换指定文本

    2.6.1 语法格式

    sed '位置参数 s/pattern/replaced/[flag]'
    
    位置参数: 与前面一样, 可以为'1,$',支持正则,也可以不指定
    s: 子命令,代表替换指定文本
    pattern: 要替换的文本,支持正则表达式
    replaced: 用来替换的一般字符串
    flag是替换标志,用来影响匹配替换的规则:
    
    flag 用法
    g 全局匹配,会替换文本行中所有匹配的字符串
    十进制n 替换文本行中第n个匹配的字符串
    p 替换第一个匹配的字符串,并且将缓冲区输出到标准输出
    w 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中
    缺省 替换第一个匹配的字符串

    2.6.2 实验

    1. 将有十个数字的那一行替换为miss letitia
    #{}要转义
    root@wzj-dev:/opt# sed -n -e 's/[0-9]\{10\}/miss letitia/g' -e '1,$ p' test1.txt
    letitia
    mail
    uuencode
    miss letitia
    01566
    
    1. 从第一行开始,到以字符ma开头的那一行, 里面的l全转为大写L
    sed -n -e '1,/^ma/ s/l/L/g' -e '1,$ p' test1.txt
    Letitia
    maiL
    uuencode
    1003605091
    01566
    

    3. 子命令组合

    对第1-3行做如下操作

    1. l全转为大写L
    2. e全转为大写E
    3. 在第二行前插入一行tyrone字符串
    4. 打印出来 ( 原来的三行加上插入的一行 )
    root@wzj-dev:/opt# sed -n '1,3{
                s/l/L/g
                s/e/E/g
                2 i tyrone
                p
                }' test1.txt
    LEtitia
    tyrone
    maiL
    uuEncodE
    

    相关文章

      网友评论

          本文标题:sed命令

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