sed 进阶使用

工作原理

sed 维护两个数据缓冲区: 活动模式空间辅助保持空间

  • 两者最初都是空的

  • sed 通过对每一行输入执行以下循环进行操作

    • 从输入流中读取一行,删除任何尾随的换行符,并将其放置在 模式空间
    • 然后执行命令,每个命令都可以有一个与之相关的 地址 【地址是一种条件代码,只有在执行命令之前验证了条件,才能执行命令】
    • 当到达脚本末尾时,除非使用 -n 选项,否则模式空间的内容将打印到输出流
    • 然后,下一个循环将为下一个输入行开始
  • 除非使用 特殊命令,否则将在两个循环之间删除 模式空间

  • 另一方面,保持空间 在周期之间保持其数据

地址

按数字选择行

  • number commands 指定行号 number 将仅匹配输入中的该行,比如:seq 6 | sed '3d' 删除第 3 行
  • first~step commands 从第 first 开始每隔 step 行进行匹配,可以计算 first + ( n * step ) 行的公式,其中 n 是周期,比如:seq 6 | sed '1~2d' 删除 1, 3, 5 行
  • $ 默认表示最后一行,但可以使用命令选项进行更改

文本匹配选行

默认的正则表达式是 BRE,通过 -E 或者 -r 选项可用 ERE

  • 形式 /regexp/ 如果正则表达式本身包含 / 字符需要进行转义 seq 6 | sed '\~3~d'

  • 正则表达式界限符 / 可以用任何其他单个字符代替,注意转义问题,比如 \%regexp%

  • 正则表达式匹配修饰符 是一个 GNU 扩展 /regexp/I

    • I: 用于不区分大小写的正则表达式匹配
    • M: 以多行模式匹配正则表达式

范围地址

通过指定用 逗号 分隔的两个地址来指定地址范围

  • n,m commands 表示第 n 行到 m 行,如果 m < n 仅匹配 n 行

  • number,/regexp/ commands 从 number 行开始到第一个匹配正则表达式的行结束:一个范围将始终跨越至少两行(输入流结束除外)

  • /regexp/,number commands 类似上面,第一个匹配正则表达式的行开始到 number 行结束(输入流结束除外)

  • /regexp/,/regexp/ commands 第一个正则表达式匹配的第一个目标行开始到第二个正则表达式匹配的第一个目标行结束

  • GNU 扩展

    • 0,/regexp/ 其中 0 会将尝试在第一输入行中匹配正则表达式,效果是正则表达式可以匹配第一行的内容
    • number,+N 在 number 行到 number+N 行
    • number,~N 从 number 行开始到 N 的倍数行结束

多行技术

可以使用 (D, G, H, N, P) 将多行作为一个缓冲区进行处理,它们与小写的对应项 (d, g, h, n, p) 相似,只是这些命令附加或减去数据同时考虑嵌入的换行符,允许从模式中添加和删除行并保留空格

  • D: 从 模式空间 中删除行,直到第一行换行,然后重新开始循环
  • G: 将 保留空间 中的行附加到 模式空间 ,并在其前面添加换行符
  • H: 将 模式空间 中的行附加到 保留空间 ,并在其前面添加换行符
  • N: 将输入文件中的行附加到 模式空间
  • P: 从 模式空间 打印行,直到第一行换行

(D, G, H, N, P) 用于多行,(d, g, h, n, p) 用于单行

例子:

$ seq 6
1
2
3
4
5
6
$ seq 6 | sed -n 'N;l;D'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
  • 首先将第一行读入模式空间 ;;; 此时模式空间:(1)
  • 在每个循环开始时,N命令将 换行下一行 附加到 模式空间 ;;; 此时模式空间:(1\n2)
  • l 命令明确地 打印模式空间的内容,此命令在打印时会额外附带一个 $ 表示行末,输出 1\n2$ ;;; 此时模式空间:(1\n2)
  • 然后,D 命令删除 模式空间 的内容,直到第一行换行,然后重新开始循环 ;;; 此时模式空间:(2)
  • 在下一个循环中,N 命令将换行符和下一个输入行附加到 模式空间 ;;; 此时模式空间:(2\n3)
  • 以此类推

处理段落等文本块(而不是逐行)的常用技术是使用以下结构

sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
  • /./{H;$!d} 对所有非空行进行操作,并将当前行(在模式空间中)添加到保持空间,在除最后一行之外的所有行中,模式空间都被删除并重新开始循环
  • x 命令将累积的行从保持空间取回模式空间
  • s 命令然后对段落中的所有文本(包括嵌入的换行符)进行操作

分支和流量控制

默认情况下

  • sed 将输入行读入模式缓冲区
  • 然后继续按顺序处理所有命令
  • 没有地址的命令会影响所有行,带地址的命令只影响匹配的行

一些命令可以用作条件或更改默认流控制

  • d 删除(清除)当前模式空间,并重新启动程序循环而不处理其余命令并且不打印模式空间
  • D 删除模式空间的内容直到第一个换行符,并重新启动程序循环而不处理其余命令并且不打印模式空间
  • 地址和正则表达式可用作 if/then 条件
  • b 无条件分支(即:始终跳转到标签,跳过或重复其他命令,而不重新启动新循环):结合地址,分支可以在匹配的行上有条件地执行
  • t 只有在读取最后一个输入行或执行另一个条件分支后,命令成功时,才有条件地分支(即:跳转到标签)
  • T 类似但与 t 命令相反:仅当自读取最后一个输入行以来没有成功的替换时才分支

b, t, T 命令后面可以跟一个 标签(通常是一个字母)

  • 标签定义为冒号后跟一个或多个字母

  • 如果省略了标签,分支命令将重新启动循环

  • 注意分支到标签和重新启动循环之间的区别:

    • 当循环重新启动时,sed 首先打印模式空间的当前内容,然后将下一个输入行读入模式空间
    • 跳转到标签(即使它在程序的开头)不会打印模式空间,也不会读取下一个输入行

构成循环

# 死循环
seq 3 | sed ':x ; bx'

解除死循环,通常由 n 或 N 个命令补充:

  • 两个命令都将下一个输入行读入模式空间,而无需等待循环重新启动
  • 在读取下一个输入行之前,n 打印当前模式空间,然后将其清空,而 N 则在模式空间中添加一个新行和下一输入行

sed 进阶使用的更多相关文章

  1. 第11章:sed进阶操作

    第11章:sed进阶操作 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为 ...

  2. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  3. sed进阶N;P;D

    案例 sed 的高级替换 $cat file1 why:1 why:2 3 4 5 why:6 why:7 8 why:9 $cat file2 why:1 why:2 3 4 5 why:6 why ...

  4. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...

  5. sed进阶

    下面这些命令未必经常会用到,但当需要时,知道这些肯定是件好事. 一.多行命令 sed命令通常是对一行数据进行处理,然后下一行重复处理. sed编辑器包含了三个可用来处理多行文本的特殊命令 N:将数据流 ...

  6. 文本处理工具——sed进阶

    一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...

  7. Shell编程—sed进阶

    1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...

  8. sed命令总结-Linux

    sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...

  9. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  10. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

随机推荐

  1. 阿里巴巴 MySQL 数据库之 SQL 语句规约 (三)

    SQL 语句规约 强制部分 [强制] 不要使用 count(列名) 或 count(常量) 来替代 count(*),count(*) 是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NU ...

  2. js 中你不知道的各种循环测速

    在前端 js 中,有着多种数组循环的方式: for 循环: while 和 do-while 循环: forEach.map.reduce.filter 循环: for-of 循环: for-in 循 ...

  3. django中的多表关联

    一.三种关联情况 二.ORM的正向操作和反向操作 1.正向操作: 一个模型中定义了一个外键,通过该模型对该外键操作的操作叫做正向操作. 2.反向操作: 被外键所关联的模型,通过该模型对外键所在模型的操 ...

  4. Vue cli使用Element UI

    当前的测试环境如下: ---- 新版的@vue/cli ---- Vue2.x版本 第一步:安装Element UI npm i element-ui -S 第二步:引入Element UI 在mai ...

  5. MYSQL 移机重装步骤(windows11)

      MYSQL 移机重装步骤(windows11)   目的:已有电脑 A,D盘安装有mysql(安装方式为免安装) , 准备在另一台电脑B上,复制安装电脑A上的mysql(8.0.23版本) . 要 ...

  6. RHCSA题目大纲

    1.配置IP地址2.配置软件仓库3.调试SELinux4.创建用户账户5. 配置cron计划任务6.创建共享目录7.配置NTP时间客户端  "chronyd服务"8. auto自动 ...

  7. Java中将jsonArray导出为Excel

        java中使用jxl导出excel时,需指定WritableSheet对象中对应于每个单元格的数据.List类型是一种常用的数据类型,它里面的元素是实体对象,当将它创建为WritableShe ...

  8. 记录nodejs做编辑和新增时候对数据库的操作

    server.js文件 const dao = require("../dao/user.dao"); saveDat是个对象自己处理一下 if (updataFlag) {//编 ...

  9. VisionPro学习笔记(7)——FitLineTool

    如果需要了解其他图像处理的文章,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice ...

  10. java多线程编程:你真的了解线程中断吗?

    java.lang.Thread类有一个 interrupt 方法,该方法直接对线程调用.当被interrupt的线程正在sleep或wait时,会抛出 InterruptedException 异常 ...