sed命令

stream editor,用程序的方式编辑文本。基本上是玩正则模式匹配。

用s命令替换

$ sed "s/my/Hao Chen's/g" pets.txt

  • 单引号去除所有字符的特殊意义,双引号保留某些字符的特殊意义

  • 默认是将处理过的内容输出,可以加-i参数直接修改原文件

    $ sed -i "s/my/Hao Chen's/g" pets.txt

  • 在每行的最前面加东西

    $ sed 's/^/#/g' pets.txt

  • 在每行的最后面加东西

    $ sed 's/$/ --- /g' pets.txt

  • 正则表达式基本

    ^ 一行的开头
    $ 一样的结尾
    \< 词首
    \> 词尾
    . 任意单个字符
    * 某个字符出现0次或多次
    [] 集合,[^]取反
  • 去除<>中的tags

    $ sed 's/<[^>]*>//g' html.txt

  • 只替换第3到6行

    $ sed "3,6s/my/your/g" pets.txt

  • 只替换第一个

    $ sed 's/s/S/1' my.txt

  • 只替换第3个以后的

    $ sed 's/s/S/3g' my.txt

  • &可以作为被匹配的变量

    $ sed 's/my/[&]/g' my.txt 给my加上[]

多个匹配

  • 分号分割

    sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt 前3行一个操作,后面一个操作
  • -e参数

    sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

圆括号匹配

  • 圆括号内匹配的字符串可以当变量使用\1,\2

    $ sed 's/This is my \([^,&]*\),.*is \(.*\)/\1:\2/g' my.txt

sed多行匹配

sed -e ":begin; /<<</,/>>>/ { />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test

:begin;标记开头

/<<</,/>>>/ 表示后面的命令只处理<<<和>>>之间的部分,

后面的/>>>/! 表示如果当前行没有匹配到结束标记/>>>/

$代表文本的最后一行,$!表示如果当前不是最后一行

N 将下一行内容追加到缓冲区,相当于"合并"成一行

b begin 表示跳回begin处重新开始执行命令

s/<<<.*>>>/COMMENT/; 终于匹配成功,将<<<到>>>之间的内容替换为COMMENT

sed的命令

  • N命令:把偶数行的内容接到奇数行进行匹配,即两两合并,\n分隔

    $ sed 'N;s/\n/,/' pets.txt 连接两行,用逗号分隔
  • a命令和i命令:插入和追加
# 第一行前插入一行
$ sed "1 i This is my monkey, my monkey's name is wukong" my.txt
#最后一行后追加一行
$ sed "$ a This is my monkey, my monkey's name is wukong" my.txt
#匹配到/fish/后追加一行
$ sed "/fish/a This is my monkey, my monkey's name is wukong" my.txt
  • c命令:替换匹配行
$ sed "2 c This is my monkey, my monkey's name is wukong" my.txt
$ sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt
  • d命令:删除匹配行
$ sed '/fish/d' my.txt
$ sed '2d' my.txt
$ sed '2,$d' my.txt
  • p命令:打印
# 默认会打印处理的信息
$ sed '/fish/p' my.txt
# -n参数只打印匹配的信息
$ sed -n '/fish/p' my.txt
# 打印从一个模式到另一个模式的信息
$ sed -n '/dog/,/fish/p' my.txt
#从第一行打印到匹配fish成功的那一行
$ sed -n '1,/fish/p' my.txt

知识点

  • pattern space

    sed处理文本的伪代码
    ​```
    对文件中每行数据
    {
    将一行数据放入pattern_space
    对每个pattern space执行sed命令
    如果没有指定-n则输出处理后的pattern space
    }
    ​```
  • Address

    [address[,address]][!]{cmd}

address可以是一个数字,也可以是一个模式

# 可以使用相对位置
$ sed '/dog/,+3s/^/# /g pets.txt'
  • 命令打包

    可以用分号分隔,也可以用大括号嵌套
# 第3到6行删除This的行
$ sed '3,6 {/This/d}' pets.txt
# 第3到6行匹配了This,再匹配fish,则删除
$ sed '3,6 {/This/{/fish/d}}' pets.txt
# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt
  • Hold Space不同行操作之间保持状态

    g: hold space > pattern space中
    G: hold space >> pattern space \n之后附加
    h: pattern space > hold space
    H: pattern space >> hold space \n之后附加
    x: 交换pattern space和hold space的内容

例如有如下文本

$ cat t.txt
one
two
three
$sed 'H;g' t.txt

one

one
two one
two
three

分析

例子2(反序输出)

$ sed '1!G;h;$!d' t.txt
three
two
one

命令可以拆解为3个

  • 1!G--只有第一行不执行G,将hold space附加到pattern space
  • h--每一行都执行h,将pattern space覆盖hold space
  • $!d--最后一行不执行d,其余都清空pattern space

分析

sed命令的基本使用方法的更多相关文章

  1. Linux sed 命令字符串替换使用方法详解

    1. sed替换的基本语法 sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义.2. 单引号” ‘ ’”是没有办法用反斜线” ...

  2. Shell之sed命令

    sed用于一次性处理所有的编辑任务,尤为高效,为用户节省了大量的时间,sed适用于以下三种场合: 1.编辑相对交互文本编辑器而言太大的文件: 2.编辑命令太复杂,在交互式文本编辑器中难以输入的情况: ...

  3. sed命令基本用法

    sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑sed 适用于以下三种场合:编辑相对交互式文本编辑器而言太大的文件编辑命令太复杂,在交互式文本编辑器中难以输入的情况对文本扫描一遍,但是 ...

  4. Linux sed命令使用方法

    sed(Stream Editor)是Linux中文本处理使用非常广泛的工具,可以对文件内容进行替换.删除.新增.选取特定行等功能.下面通过sed常用实例介绍sed命令的使用方法. sed基本语法 s ...

  5. linux shell 用sed命令在文本的行尾或行首添加字符

    转自 http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed ...

  6. linux sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  7. sed命令详解

    搜索 纠正错误  添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...

  8. Linux安全基础:sed命令的使用

    sed 是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...

  9. sed命令手册

    sed 是一种在线编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space). 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内 ...

随机推荐

  1. Minimum Spanning Trees

    Kruskal’s algorithm always union the lightest link if two sets haven't been linked typedef struct { ...

  2. MDK5报错missing closing quote

    用emwin做界面的时候遇到的错误,MDK5可能无法编译一些汉字编码,对应汉字在信息反馈中会显示为乱码,更会附带一些如“expected a "}"”这样的错误提示. 解决方法:O ...

  3. 用python写一个名片管理系统

    info = [] #先定义一个空字典while True: #利用while循环 print(' 1.查看名片') #第一个选项 print(' 2.添加名片') #第二个选项 print(' 3. ...

  4. 【Linux】scp指令

    语法: scp [可选参数] file_source file_target 参数说明: -1: 强制scp命令使用协议ssh1 -2: 强制scp命令使用协议ssh2 -4: 强制scp命令只使用I ...

  5. TP5对数据库操作的事物作用

    假如: 你写好了一段完整的代码,模型对数据库的操作,增删改查什么的,都没有问题,当然运行速度也是最快的,完全不用担心会出错, 前提肯定是已经写好的一整段代码, 但是,万一服务器中断了呢,执行一半,后面 ...

  6. 免app下载笔趣阁小说

    第一次更新:发现一个问题,就是有时候网页排版有问题的话容易下载到多余章节,如下图所示: 网站抽风多了一个正文一栏,这样的话就会重复下载1603--1703章节. 解决办法: 于是在写入内容前加了一个章 ...

  7. 实验五 CC2530平台上ADC组件的TinyOS编程

    实验五 CC2530平台上ADC组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握传感器的ADC组件应用方法 学生通过本实验能够初步的了解和掌握CC ...

  8. MySQL更新死锁问题【转,纯为学习】

    https://blog.csdn.net/a12345555555/article/details/72828366 -08-13 15:12:44 [ERROR] com.zhubajie.cou ...

  9. Mysql 8.0 导入txt文件操作(课程实验)

    一.实验准备: 1.实验设备:Dell laptop 7559; 2.实验环境:windows 10操作系统; 3.数据库版本:mysql 8.0; 二.实验目的: 1.将一个宠物表pet.txt文件 ...

  10. mongoDB创建windows服务启动解决

    最近想了解一下关于MongoDB的知识,记得之前电脑上安装的MongoDB也能正常启用,可是这次在使用mongodb,却遇到一下小麻烦啊.mongodb无法启动,小编很苦恼,尝试了各种方法,甚至卸载重 ...