sed与awk读书笔记[sed篇]

2023-10-29

简介

grep、sed、awk是处理文本的强大工具。
perl是在grep、sed、awk基础上,产生的语言。
现在,个人习惯是,文本处理用grep、sed、awk,命令胶水用perl。

不要追求编程语言的唯一化,多种语言语法类似,功能却很有特色。好处还有,程序看起来更简洁,更容易理解。

grep、sed、awk、perl对正则表达式的使用,是有区别的。这一点,要熟悉注意。参考文档1

个人基础及笔记重点

  • sed/grep/awk熟悉
    初级教程看2
  • 不精通
  • 主要是了解忽略的细节(初级用户看中文教程,完成入门–>熟悉之路)。从熟悉–>精通之路。还是突出实用,复杂的用perl脚本去实现。
  • 很多话,特别是sed高级部分,都是自己理解的。如有错误,在所难免。

sed基础

sed处理大文件很方便,使用vim等编辑1M以上的文件,太慢;编辑1G以上的文件,力不从心,会崩溃。
sed高级应用,主要是熟悉模式空间。只有两个空间,1是pattern space模式空间;2是hold space保持空间。
sed正则表达式必须要熟悉。不管是sed,其它grep、awk、perl都是基于正则表达式的语言脚本。
sed命令,主要包括参数+寻址+命令+标志。如替换命令的格式,
[address]s/pattern/replacement/flags

常用参数包括:

  • i,edit in place。即直接作用于文本,不会有备份,要注意。
  • n,不打印非匹配的行。一般结合p命令使用,只显示特别的行。
  • e,连续命令。这个参数不必要,不如直接用;隔开每个sed命令。
  • 其它参数,用sed --help查阅

寻址包括:

  • 没有寻址,命令作用于每一行。如s/aaa/bbb/;注意s/aaa/bbb/g,全局替换是指的行内全局。
  • 只有一个地址,命令作用于匹配的那些行。如/ccc/s/aaa/bbb/
  • 寻址用逗号分隔的,命令作用于起始到结束的行。如1,5s/aaa/bbb/,1~5行做替换。
  • 感叹号,命令作用于不匹配的那些行。如/ccc/!s/aaa/bbb/

常用命令包括:

因为sed起源一个行编辑器ed,所以命令一般都是单字符。结合vim里的命令去记忆理解很容易。

  • 一共25个命令;
  • d #删除
  • a\ text #追加append
  • c\ text #change
  • i\ text #插入
  • l #小写的L,列表命令,显示模式空间的内容(之后将模式空间)。可以显示不能输入的字符,查阅特别字符时很管用。比如日常偶尔碰到的,代码看起来完全正确,但是执行报告错误;这也许是有看不见的特殊字符导致的bug。
  • [address]y/abc/ABC/ #y命令是字符转换命令,是单字符的转换。比如这个命令的意思是,a转换或者替换为A;b转换或者替换为B;c转换或者替换为C。
  • p #打印命令,一般跟sed -n 配合使用。
  • = #打印行号。
  • n #本行跳过执行命令,直接下一行。(跟模式空间配套使用)
  • [line-address]r file #读命令,只能用行号范围进行匹配。【不怎么用到】
  • [address]w file #写命令。【不怎么用到】
  • [line-address]q #退出命令。只对单行有意义。

标志flags

  • n #1~512之间的数字,对第几个进行命令执行。
  • g #全局global,进行命令执行。
  • p #打印命令
  • W file #写入文件

正则表达式

  • ^ #表示匹配模式空间的开头。不要单纯理解为行首
  • $ #表示匹配模式空间的结尾。不要单纯理解为行尾
  • 注意:如果用到sed多行处理模式时,^和$就不是行首行尾的意义了。

sed高级(这一章要详细讲解,要不迷惑性太大。举例。)

sed高级命令,主要包括3个部分:
1. 多行处理模式空间(N P D),注意与(n p d)的区别!!!个人经验:多行处理时,不要用npd命令,否则理解混乱。
2. 采用保持空间hold space,用来保存模式空间的内容,并使之继续服务于后续命令。
3. 分支和条件指令(: b t)

参考文档3

熟悉–>精通之路,必需技巧工具:
利用sed调试工具sedsed4,去理解sed命令每一步执行后的效果。sedsed需要python5编译器支持,而且必须是python2版本,而不是python3版本。sedsed调试命令很简单,不再赘述。

N命令

n命令,是忽略当前行的命令,直接去下一行开始命令执行。
N命令,追加下一行到模式空间的内容,而且下一行就不会执行命令。(看来模式空间,要在sed高级章节之前讲解,否则越来越费劲)
注意:N还有另外一个特性:当无法处理下一行内容时,N则会中止退出,所以后面的命令也不会再执行。比如最后一行处理时,遇到N命令,会无法处理最后一行的其它命令。所以建议N命令,就直接使用$!N得了($!N,意思就是最后一行不执行N命令,其它行都执行N命令),避免不必要的debug困难。
参考文档:

下面讲讲N(我只用$!N)命令的描述与例子:多行的处理。
这里写图片描述
执行过程如下:

$ cat sed.1
consult section 3.1 in the owner and operator
guide for a description of the tape drives
available on your system
aaaaaaaaaaaaaa owner and operator111
bbbbbbbbbbbbbbbbbbbb
$ sed '/operator$/{$!N;s/owner and operator\nguide /installation guide/}' sed.1
consult section 3.1 in the installation guidefor a description of the tape drives
available on your system
aaaaaaaaaaaaaa owner and operator111
bbbbbbbbbbbbbbbbbbbb
$ /d/python27/sedsed -d --color '/operator$/{$!N;s/owner and operator\nguide /installation guide/}' sed.1
PATT:consult section 3.1 in the owner and operator$
HOLD:$
COMM:/operator$/ {
COMM:$ !N
PATT:consult section 3.1 in the owner and operator\nguide for a descr\
iption of the tape drives$
HOLD:$
COMM:s/owner and operator\nguide /installation guide/
PATT:consult section 3.1 in the installation guidefor a description o\
f the tape drives$
HOLD:$
COMM:}
PATT:consult section 3.1 in the installation guidefor a description o\
f the tape drives$
HOLD:$
consult section 3.1 in the installation guidefor a description of the tape drives
PATT:available on your system$
HOLD:$
COMM:/operator$/ {
PATT:available on your system$
HOLD:$
available on your system
PATT:aaaaaaaaaaaaaa owner and operator111$
HOLD:$
COMM:/operator$/ {
PATT:aaaaaaaaaaaaaa owner and operator111$
HOLD:$
aaaaaaaaaaaaaa owner and operator111
PATT:bbbbbbbbbbbbbbbbbbbb$
HOLD:$
COMM:/operator$/ {
PATT:bbbbbbbbbbbbbbbbbbbb$
HOLD:$
bbbbbbbbbbbbbbbbbbbb

注意:不能用\n表示换行,可以用\回车,命令里写成两行。这样就可以输出换行符。如下命令:

$ sed '/operator$/{$!N;s/owner and operator\nguide /installation guide\
/}' sed.1
consult section 3.1 in the installation guide
for a description of the tape drives
available on your system
aaaaaaaaaaaaaa owner and operator

D命令

d命令,是删除匹配的那一行;
D命令,是多行处理模式空间的命令,是删除匹配的第一行。而且可以认为,N和D一起时,N的下一行不会执行sed命令;但是D命令会改变N这个策略,D命令会要求N的下一行也执行sed命令。
这里写图片描述

这段话理解有些困难。利用sed调试工具sedsed,去理解sed命令的效果。

举例:多行空格删减为一行

$ cat sed.2
this line is followd by 1 blank line.

this line is followd by 2 blank line.


this line is followd by 3 blank line.



this line is followd by 4 blank line.




this is the end.
$ sed '/^$/{$!N;/^\n$/D}' sed.2
this line is followd by 1 blank line.

this line is followd by 2 blank line.

this line is followd by 3 blank line.

this line is followd by 4 blank line.

this is the end.
$ /d/python27/sedsed -d --color  '/^$/{$!N;/^\n$/D}' sed.2
PATT:this line is followd by 1 blank line.$
HOLD:$
COMM:/^$/ {
PATT:this line is followd by 1 blank line.$
HOLD:$
this line is followd by 1 blank line.
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\nthis line is followd by 2 blank line.$
HOLD:$
COMM:/^\n$/ D
PATT:\nthis line is followd by 2 blank line.$
HOLD:$
COMM:}
PATT:\nthis line is followd by 2 blank line.$
HOLD:$

this line is followd by 2 blank line.
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\nthis line is followd by 3 blank line.$
HOLD:$
COMM:/^\n$/ D
PATT:\nthis line is followd by 3 blank line.$
HOLD:$
COMM:}
PATT:\nthis line is followd by 3 blank line.$
HOLD:$

this line is followd by 3 blank line.
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\nthis line is followd by 4 blank line.$
HOLD:$
COMM:/^\n$/ D
PATT:\nthis line is followd by 4 blank line.$
HOLD:$
COMM:}
PATT:\nthis line is followd by 4 blank line.$
HOLD:$

this line is followd by 4 blank line.
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\n$
HOLD:$
COMM:/^\n$/ D
PATT:$
HOLD:$
COMM:/^$/ {
COMM:$ !N
PATT:\nthis is the end.$
HOLD:$
COMM:/^\n$/ D
PATT:\nthis is the end.$
HOLD:$
COMM:}
PATT:\nthis is the end.$
HOLD:$

this is the end.

跳转命令:a;….;ba;

不管…;命令是否执行成功,都会跳转到:a位置,然后开始执行命令。

跳转命令:a;….;ta;

判断…;命令是否执行成功,如果执行成功会跳转到:a位置,然后开始执行命令;如果执行失败不会跳转。

h/H;g/G;x利用保持空间的命令

这里写图片描述
命令很容易理解,需要做的,无非就是利用以上命令,形成一个算法。
复杂的sed命令,就用sedsed去调试理解。

熟悉例子

SED单行脚本快速参考
http://sed.sourceforge.net/sed1line_zh-CN.html

结合sedsed调试命令,查看命令执行过程,消化理解。可以事倍功半。

最后是自己写程序,debug。

最大的感受,还是sedsed调试命令。语法学习,还是要从调试手段来加深理解。


  1. grep、sed、awk、perl等对正则表达式的支持的差别 - 流浪的洋葱 - 开源中国社区
    https://my.oschina.net/onionsheep/blog/346926
  2. Sed与AWK入门教程之Sed篇 - 浪人的星空 - 博客频道 - CSDN.NET
    http://blog.csdn.net/hitlion2008/article/details/9247173
  3. 对一个sed”N;P;D”多行模式处理语句的分析 - 黑会峰 - 博客频道 - CSDN.NET
    http://blog.csdn.net/heihuifeng/article/details/7943982
  4. sedsed
    http://aurelio.net/projects/sedsed/
  5. windows系统下Python环境的搭建 - InSky - 博客园
    http://www.cnblogs.com/windinsky/archive/2012/09/20/2695520.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sed与awk读书笔记[sed篇] 的相关文章

  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it

随机推荐

  • 数据挖掘 NO.1 数据挖掘入门

    1 机器学习 代价函数 m是样本数量 直到最后得到的值收敛或者样本使用完 1 定义代价函数 2 对每个参数求偏导数 3 使用梯度下降算法更新 数据集先开始进行划分 解决OVERFITTING 1 在测试集评估模型 2 Regelizatio
  • Hibernate之多对多级联查询、新增、删除

    以书籍与书籍类别为例 一本书可以有多种类型 一种类型也可以对应多本书 书籍和书籍类别的关系是多对多的关系 他们的关系是在中间表里面的 多对多通过一个表找到另一个表的数据的条件为 中间表 中间表对应本表的外键 中间表对应关联表的外键 注 多对
  • 使用picgo配置图床使用

    图床这种东西 做博客是必须要的 这里我记录目前我使用的几种图床 方便以后使用 以后有新的好用的 也会相应的更新 sm ms图床 免费的sm sm ms图床 好用 速度还可以 下面图片是sm图 可以感受一下速度 csdn图床 csdn这个社区
  • 【裸机开发】I2C 通信接口(二)—— I2C 寄存器解析

    目录 一 硬件原理图分析 二 IO 复用寄存器解析 三 I2C 寄存器解析 3 1 时钟配置 3 2 I2C1 IADR 设置从机地址 3 3 I2C1 IFDR 设置分频值 3 4 I2C1 I2CR I2C使能 中断控制 3 5 I2C
  • ArcPy批量计算栅格数据平均值

    遥感数据处理系列 一些项目及科研中遇到的小需求 一方面记录自己的学习历程 另一方面帮助大家学习 本系列文章的开发环境为 ArcGIS 10 2 2 Python 2 7 ENVI 5 3 IDL 8 5 ArcPy批量计算栅格数据平均值 G
  • Keil C51从汇编跳转到main函数编译器报错ERROR L127: UNRESOLVED EXTERNAL SYMBOL的解决办法

    51单片机系列教程主仓库地址 https gitee com langcai1943 8051 from boot to application 遇到的问题1 如果你自建的汇编原文件不是以Keil默认的 A51或者 s S结尾 而是以 as
  • 华为手机连电脑当摄像头用_华为手机摄像头还能这样用!300页文档轻松电子化,堪称职场法宝...

    华为手机摄像头还能这样用 300页文档轻松电子化 堪称职场法宝 我们生活中经常会使用相机记录一些美好的瞬间 可是你知道吗 华为手机摄像头还能这样用 300页的纸质文档可轻松电子化 堪称职场法宝 使用过华为手机的朋友们 应该都知道华为手机的拍
  • 三极管使用详解

    扣扣技术交流群 460189483 PNP型的三极管使用方法 常见的三极管为9012 s8550 9013 s8050 单片机应用电路中三极管主要的作用就是开关作用 其中9012与8550为pnp型三极管 可以通用 其中9013与8050为
  • Ubuntu需要运行networkmanager的解决方法

    问题 在使用ubuntu时无法联网 打开网络设置发现如下情况 解决方法 打开终端 输入su 获取管理员权限 然后输入systemctl start NetworkManager service 完成后即可正常联网了 新问题 每次开机后都需要
  • 元器选型攻略之 电感

    电子元器件领域电阻 电容 电感被称为 三剑客 其中电感又被称为 渣男 什么是电感 提到电感 离不开电感线圈这个名词 即用绝缘导线绕制而成的电磁感应元件 要理解电感 首先了解几个名词 感生 变化 改变 让我们回到高中课本 1 当一个导体相对磁
  • 论文笔记:Deep Representation Learning for Trajectory Similarity Computation

    ICDE 2018 1 intro 1 1 背景 用于计算轨迹相似性的成对点匹配方法 DTW LCSS EDR ERP 的问题 轨迹的采样率不均匀 如果两个轨迹表示相同的基本路径 但是以不同的采样率生成 那么这些方法很难将它们识别为相似的轨
  • Qt 之 QSS(样式表语法)

    简述 Qt样式表 以下统称QSS 的术语和语法规则几乎和CSS相同 如果你熟悉CSS 可以快速浏览以下内容 样式规则 QSS包含了一个样式规则序列 一个样式规则由一个选择器和声明组成 选择器指定哪些部件由规则影响 声明指定哪些属性应该在部件
  • 以XML形式访问远程接口获得数据

    JDK提供了供我们访问url获得数据的类 核心类主要是URL URLConnection等 详见JDK API 下面以XML形式实现两者通信 Servlet端发送信息 Java代码 protected void doGet HttpServ
  • Unity3D官方教程——Survival Shooter学习记录

    unity 官方教程Survival Shooter 学习笔记 1 准备工作 新建项目并导入官方商店的Survival Shooter资源 在Assets下新建文件夹 Scence并在新文件夹内保存当前新场景命名为Main 2 背景和背景音
  • allegro设置禁止铺铜区的方法

    allegro设置禁止铺铜区的方法 Cadence Allegro 16 6 关于shape分割的一种方法 Allegro 铺铜设置 使用Shape Keepout设置禁止铺铜区 操作方法是Setup Areas Shape Keepout
  • 数据可视化python,绘制饼图,代码和解析

    饼图样式 使用matplotlib pyplot pie绘制 代码描述 import matplotlib pyplot as plt import pandas as pd 定义饼状图的标签 标签是列表 timeData pd read
  • Leetcode刷题(14. 最长公共前缀)

    Leetcode刷题 14 最长公共前缀 一 题目 二 代码 C 三 提交记录 四 备注 一 题目 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 1 输入 flower flow flight 输出
  • 延长线段ab到c的画法有几种_垂直与平行的画法

    点击蓝字关注我们 垂直与平行的画法 现在中考对作图要求越来越高 作图是对我们应用数学基本定理 性质以及动手能力的一种考察 问题的关键在于学生平时忽视了定理 性质的重要性 甚至初三念完了书还是新的 通过作图 对定理和性质进行理解记忆 问题1
  • 使用Python爬取不同类别的豆瓣电影简介

    使用Python爬取不同类别的豆瓣电影简介 之前做过一点文本分类的工作 从豆瓣上爬取了不同类别的数千条电影的简介 爬取目标 我们爬取的目标是 豆瓣影视 打开豆瓣网 随便点击一部电影 即可看到电影的介绍 评论等信息 我们需要爬取的是电影的简介
  • sed与awk读书笔记[sed篇]

    简介 个人基础及笔记重点 sed基础 常用参数包括 寻址包括 常用命令包括 标志flags 正则表达式 sed高级这一章要详细讲解要不迷惑性太大举例 N命令 D命令 跳转命令aba 跳转命令ata hHgGx利用保持空间的命令 熟悉例子 最