Sed and awk 笔记之 sed 篇:高级命令(二)

上一篇中介绍了N/D/P三个命令,它们可以形成多行的模式空间,在一点程度上弥补了单行模式空间的不足,我们用sed编辑文本的能力又进了一步。模式空间是sed内部维护的一个缓存空间,它存放着读入的一行或者多行内容。但是模式空间的一个限制是无法保存模式空间中被处理的行,因此sed又引入了另外一个缓存空间——模式空间(Hold Space)。

保持空间

保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间。sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容。

操作保持空间的命令如下所示:

名称 命令 说明
保存(Hold) h/H 将模式空间的内容复制或者追加到保持空间
取回(Get) g/G 将保持空间的内容复制或者追加到模式空间
交换(Exchange) x 交换模式空间和保持空间的内容

查看全文

Sed and awk 笔记之 sed 篇:高级命令(一)

上一篇中介绍的基础命令都是面向行的,一般情况下,这种处理并没有什么问题,但是当匹配的内容是错开在两行时就会有问题,最明显的例子就是某些英文单词会被分成两行。

幸运地是,sed允许将多行内容读取到模式空间,这样你就可以匹配跨越多行的内容。本篇笔记主要介绍这些命令,它们能够创建多行模式空间并且处理之。其中,N/D/P这三个多行命令分别对应于小写的n/d/p命令,后者我们在上一篇已经介绍。它们的功能是类似的,区别在于命令影响的内容不同。例如D命令与d命令同样是删除模式空间的内容,只不过d命令会删除模式空间中所有的内容,而D命令仅会删除模式空间中的第一行。

读下一行:N

N命令将下一行的内容读取到当前模式空间,但是下n命令不一样的地方是N命令并没有直接输出当前模式空间中的行,而是把下一行追加到当前模式空间,两行之间用回车符\n连接,如下图所示:

read_newline

模式空间包含多行之后,正则表达式的^/$符号的意思就变了,^是匹配模式空间的最开始而非行首,$是匹配模式空间的最后位置而非行尾。

查看全文

Sed and awk 笔记之 sed 篇:基础命令

在开始之前,首先回顾上一篇的重点内容:地址匹配。上一篇中介绍过,地址可以指定0个,1个或者2个。地址的形式可以为斜杠分隔的正则表达式(例如/test/),行号(例如3,5)或者特殊符号(例如$)。如果没有指定地址,说明sed应用的编辑命令是全局的;如果是1个地址,编辑命令只是应用到匹配的那一行;如果是一对地址,编辑命令则应用到该地址对匹配的行范围。关于地址匹配的内容具体可以看Sed命令地址匹配问题总结

书中说,对于sed编辑命令的语法有两种约定,分别是

[address]command               # 第一种
[line-address]command          # 第二种

查看全文

Sed and awk 笔记之 sed 篇:模式空间与地址匹配

模式空间

在上一篇Sed&awk笔记之sed篇:简单介绍中,我们曾经介绍过简单的sed处理流程,这里首先回顾下:

  1. 读入新的一行内容到缓存空间;
  2. 从指定的操作指令中取出第一条指令,判断是否匹配pattern;
  3. 如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
  4. 如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
  5. 当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
  6. 当所有行都处理完之后,结束;

由此可见,sed并非是将一个编辑命令分别应用到每一行,然后再取下一个编辑命令。恰恰相反,sed是以行的方式来处理的。另外一方面,每一行都是被读入到一块缓存空间,该空间名为模式空间(pattern space),这是一个很重要的概念,在后文中会多次被提及。因此sed操作的都是最初行的拷贝,同时后续的编辑命令都是应用到前面的命令编辑后输出的结果,所以编辑命令之间的顺序就显得格外重要。

简单例子

让我们来看一个非常简单的例子,将一段文本中的pig替换成cow,并且将cow替换成horse:

$ sed 's/pig/cow/;s/cow/hores/' input

查看全文

Sed and awk 笔记之 sed 篇:简单介绍

最近在阅读《sed & awk》,这本书是sed和awk相关书籍中比较经典的一本。我在读书的时候有一个习惯,就是会作一些笔记,如果有条件我会放到博客中。写博客不仅是给别人看的,更是写给自己看的,同时因为写给别人看,所以必然会在一些细节的地方写得很清楚明了,可以加深自己对原书的理解,同时以后回头看的时候,我自己也能快速的回忆起来。

另外一方面,我会选择英文原版来阅读而非中文翻译版,主要是出于英文版的内容更加准确、容易领会作者的本意这个方面的原因。毕竟翻译的内容一方面因为翻译的时候会丢失一些原版的意思,同时因为不同的人有不同的理解,在翻译中可能会夹杂着自己个人的理解。就好比这一系列的文章,许多内容都是出自原书,我只不过是翻译了些内容加了点注解而已,所心也只能称之为笔记。

文中对一些术语的翻译只是按本人自己的喜好而定,请见谅。

本系列包含两部分的内容:sed篇和awk篇。

sed篇总共分成6章:

awk篇暂时还未计划。

Sed是什么

《sed and awk》一书中(1.2 A Stream Editor)是这样解释的:

Sed is a "non-interactive" stream-oriented editor. It is stream-oriented because, like many UNIX
programs, input flows through the program and is directed to standard output.

查看全文

在终端右上角显示时间

前两天,在知乎的一个问答中(上Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?),看到有人在回复中推荐commandlinefu.com这个网站,回头就收藏了,这个网站是介绍一些常用或者很技巧的一些命令:

commandlinefu.com is the place to record those command-line gems that you return to again and again.

Delete that bloated snippets file you've been using and share your personal repository with the world. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down.

今天在上面看到一篇很有意思的文章,介绍了如何在终端上显示时间:Put a console clock in top right corner。文中给出了两种方法,一种是利用ANSI Escape Sequences,另外一种是通过tput这个命令。

第一种方法

命令如下:

while true; do echo -ne "\e[s\e[0;$((COLUMNS-27))H$(date)\e[u"; sleep 1; done &

查看全文

光棍节闯关游戏第9关

感谢@t.k.同学指正

你不能给第八关的地址,建议给第七关的地址,因为进入第七关的key是google出来的,应该是一个定值。在我的电脑上就不能进入你的第八关链接。

第七关到第八关的Key就是页面中直接给出让你试试的key,这个key是会变化的,正如t.k.童鞋据说的。打开第八关的地址,然后把表单的method从get修改为post即可进入第9关。第9关的页面是这样的:

查看全文

实用 Shell 文档

Shell 文档

ChinaUnix上大神網中人总结的Shell十三问?强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点。每一问都写得非常精彩。

同样是ChinaUnix上,wingger大神整理的Shell基础二十篇。这份文档涉及的内容比较多,我没记错的话应该有很多命令的用法,而且配备实际使用的例子,对初学者帮助甚大。

Shell脚本专家指南也是一本不可多得的好书,我是之前在学校的时候买的这本书。上面都是作者实际工作中的经验总结,你可以从中学到很多其它书上学不到的实践知识。千万不要被专家两个字吓住了,书名的意思是专家给你总结的学习指南。

注:mingxinglai也在他的博客文章shell脚本学习材料种整理了很多实用的资料。

正则表达式

我个人学习正则表达式是从正则表达式30分钟入门教程开始的,这份文档让我了解了正则表达式的一些基础术语和基本的用法。

查看全文