• Sed 日常使用介绍


    Sed 日常使用介绍

    简介

    sedunix 环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流。

    各个 unix/linux 发行版都会配备 sed 及其衍生的命令工具, 因此, 掌握该工具的基本用法, 足以满足我们日常的许多文本处理的任务。

    以下采用示例的方式对 sed 进行基本用法介绍. 如果有兴趣了解更高级的使用技巧, 本文采用的是 GNU sed 4.4 版本进行示例介绍, 以下示例可在 GNU bash 4.4.20(1) 版本下运行。

    请参阅 参考文档

    文章约定

    • 本文采用命令行示例来讲解用法, 格式如下:
      • ### 开头内容均为注释
      • $ 开头内容均为命令行
      • 顶格开头内容均为命令执行后输出结果

    Sed 日常基本用法

    Sed 打印/输出

    • 打印出匹配条件的内容
    ### -n 选项代表只打印匹配的行
    ###    如果没有 -n 选项, 则会打印所有输入内容, 同时再打印匹配的内容
    $ echo -e "hello
    python
    php" | sed -n -e '/python/p'
    
    python
    
    • 打印第 3 行内容
    $ echo "hello
    python
    and
    php" | sed -n -e '3 p'
    
    • 打印第 1~2 行内容
    $ echo -e "hello
    python
    php" | sed -e '1,2p' sample.txt
    
    hello
    python
    
    • 输出 1~7 数字序列,每行一个数字,每3行替换数字为 x
    $ seq 7 | sed -e 'n; n; s/./x/g'
    
    1
    2
    x
    4
    5
    x
    
    • 不打印第 2~3 行
    $ echo "hello
    world
    python" | sed -n -e "2,3! p"
    
    • 打印从第 1 行开始, 第 n 次输出行为 1 + n * 3 的行
    $ seq 10 | sed -n -e '1~3p'
    
    1
    4
    7
    10
    

    Sed 删除

    • 删除包含 python 的行, 忽略大小写
    ### /regex/ regex 是正则, I 表示忽略大小写, d 表示删除匹配内容
    $ echo -e "hello
    python 2.7
    php
    Python 3
    IPython
    C++" | sed -e '/python/Id'
    
    hello
    php
    C++
    
    • 删除第 2 行
    $ echo -e "hello
    python 2.7
    php
    Python 3" | sed -e '2d'
    
    hello
    php
    Python 3
    
    • 删除 2~3 行
    $ echo -e "hello
    python 2.7
    php
    Python 3
    IPython
    C++" | sed -e '2,3d'
    
    hello
    Python 3
    IPython
    C++
    
    • 从第 2 行删除到最后一行
    $ echo -e "hello
    python 2.7
    php
    Python 3
    IPython
    C++" | sed -e '2,$d'
    
    hello
    
    • 删除所有空行
    $ echo "hello,
    
    world.
    hello,
    
    python." | sed -e '/^s*$/d'
    
    hello,
    world.
    hello,
    python.
    

    Sed 替换

    Sed 替换命令格式

    替换命令格式: [address range]s/regex/replacement/[flags]

    • s: 表示替换命令
    • regex: 正则表达式
    • replacement: 替换内容. & 可以获取匹配的内容, N 可以获取匹配分组的内容, 1 可以获得正则匹配到的分组内容第一个元素
    • flags:
    • g - 全部替换
    • 其他请参考 manual (如: 命令行 man sed)
    Sed 替换示例
    • 替换第一个 cat 为 dog
    $ echo -e "I like cat but you don't like cat!" | sed -e 's/cat/dog/'
    
    I like dog but you don't like cat!
    
    • 替换所有的 cat 为 dog
    $ echo -e "Everyone like cat and I like cat too!" | sed -e 's/cat/dog/g'
    
    Everyone like dog and I like dog too!
    
    • 在所有包含 cat 的行中, 替换 python 为 php
    $ echo "Tom like cat and python.
    James like dog and python.
    Kate like cat and php." | sed -e '/cat/ s/python/php/g'
    
    Tom like cat and php.
    James like dog and python.
    Kate like cat and php.
    
    • 在所有不包含 cat 的行中, 替换 python 为 php.
    ### 注意 ! 和 s 之间需要有空格. /cat/! 标示匹配 /cat/ 范围之外的行
    ### 同理, 1,2! 标示不要第 1 到 第 2 行
    $ echo "Tom like cat and python.
    James like dog and python.
    Kate like cat and php." | sed -e '/cat/! s/python/php/g'
    
    Tom like cat and python.
    James like dog and php.
    Kate like cat and php.
    
    • 在第 2~3 行中, 替换 python 为 php
    $ echo "I like python.
    James like python too.
    Kate like go and python." | sed -e '2,3s/python/php/g'
    
    I like python.
    James like php too.
    Kate like go and php.
    
    • 在正则替换表达式中, 使用其他字符替换 '/' 作为分隔符
    ### 替换目录 '/aaa/bbb' 为 '/var/log', 使用 | 作为分隔符
    $ echo "/aaa/bbb/ccc" | sed -e 's|/aaa/bbb|/var/log|g'
    
    /var/log/ccc
    
    • 使用正则匹配的内容进行替换
    $ echo "Hello, I like python" | sed -e 's/python/& and php/'
    
    Hello, I like python and php
    
    • 获取正则匹配的分组内容的第一部分
    $ echo "Hello, I like python" | sed -e 's/(python)/1 and php/'
    
    Hello, I like python and php
    

    Sed 一对一转换特定字符

    • 把 a e i o 字母一一转换为 A E I O
    $ echo "I like python and php." | sed -e 'y/aeio/AEIO/'
    
    I lIkE pythOn And php.
    

    Sed 替换文件内容

    • 直接替换文件内容, 把所有包含 python 的行删除.
    ### -i[backup_suffix] 后面紧跟着备份文件名后缀名.
    ### 如果 [backup_suffix]为 '' 空字符串,则表示直接替换原始文件内容,不备份
    $ cat sample.txt
    Hello
    world.
    I like python and php.
    $ sed -i'' -e '/python/d' sample.txt
    $ cat sample.txt
    Hello
    world.
    

    参考文档

  • 相关阅读:
    洛谷P5979 [PA2014]Druzyny
    洛谷P5592 美德的讲坛
    BZOJ4231 回忆树
    Python爬虫〇二———从几个简单的爬虫开始
    Flink实例(115):自定义时间和窗口的操作符(十四)窗口操作符(四)触发器(Triggers) (二)
    商业化数据分析师(三十二):平台商品画像实战项目(三)购物篮分析
    商业化数据分析师(三十一):平台商品画像实战项目(二)如何构建商品画像-- 以移动电源为例
    商业化数据分析师(三十):平台商品画像实战项目(一)简介
    商业化数据分析师(二十九):平台用户画像实战项目(二)如何构建平台用户的用户画像
    商业化数据分析师(二十八):平台用户画像实战项目(一)什么是用户画像体系以及商户用户画像和平台用户画像的区别
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/12713697.html
Copyright © 2020-2023  润新知