快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京返水在哪里_龟发之家论坛



强健的 sed

在 第二篇 sed 文章中,我供给了一些示例来演示 sed 的事情道理,然则它们傍边很少有示例能实际做分外 有用的事。在这篇 sed 系列的着末文章中,我要改变那种要领,并应用 sed 来做实际的事。我将为您显示几个示例,它们不仅演示 sed 的能力,而且还做一些真正奇妙(和方便)的事。例如,在本文的后半部,将为您演示若何设计一个 sed 脚原先将 .QIF 文件从 Intuit 的 Quicken 金融法度榜样转换成具有优越款式的文本文件。在那样做之前,我们将看一下不怎么繁杂但却很有用的 sed 脚本。

文本转换

第一个实际脚本将 UNIX 风格的文本转换成 DOS/Windows 款式。您可能知道,基于 DOS/Windows 的文本文件在每一行末端有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行。无意偶尔可能必要将某些 UNIX 文本移至 Windows 系统,该脚本将为您履行必需的款式转换。

$ sed -e 's/$/r/' myunix.txt > mydos.txt

在该脚本中,'$' 规则表达式将与行的末端匹配,而 'r' 奉告 sed 在其之前插入一个回车。在换行之前插入回车,急速,每一行就以 CR/LF 停止。请留意,仅当应用 GNU sed 3.02.80 或今后的版本时,才会用 CR 调换 'r'。假如还没有安装 GNU sed 3.02.80,请在我的 第一篇 sed 文章中查看若何这样做的阐明。

我已记不清有若干次鄙人载一些示例脚本或 C 代码之后,却发明它是 DOS/Windows 款式。虽然很多法度榜样不在乎 DOS/Windows 款式的 CR/LF 文本文件,然则有几个法度榜样却在乎 -- 最闻名的是 bash,只要一碰到回车,它就会出问题。以下 sed 调用将把 DOS/Windows 款式的文本转换成可托赖的 UNIX 款式:

$ sed -e 's/.$//' mydos.txt > myunix.t澳门新葡新京返水在哪里xt

该脚本的事情道理很简单:替代规则表达式与一行的最末字符匹配,而该字符正好便是回车。我们用空字符调换它,从而将其从输出中彻底删除。假如应用该脚本并留意到已经删除了输出中每行的最末字符,那么,您就指定了已经是 UNIX 款式的文本文件。也就没需要那样做了!

反转行

下面是另一个方便的小脚本。与大年夜多半 Linux 发行版中包括的 "tac" 敕令一样,该脚本将反转文件中行的序次。"tac" 这个名称可能会给人以误导,由于 "tac" 不反转行中字符的位置(左和右),而是反转文件中行的位置(上和下)。用 "tac" 处置惩罚以下文件:

foo bar oni

....将孕育发生以下输出:

oni bar foo

可以用以下 sed 脚本达到相澳门新葡新京返水在哪里同目的:

$ sed -e '1!G;h;$!d' forward.txt > backward.txt

假如登录到碰巧没有 "tac" 敕令的 FreeBSD 系统,将发明该 sed 脚本很有用。虽然方便,但最好照样知道该脚本为什么那样做。让我们对它进行评论争论。

反转解释

首先,该脚本包孕三个由分号隔开的零丁 sed 敕令:'1!G'、'h' 和 '$!d'。现在,必要好好理解用于第一个和第三个敕令的地址。假如第一个敕令是 '1G',则 'G' 敕令将只利用第一行。然而,还有一个 '!' 字符 -- 该 '!' 字符 轻忽该地址,即,'G' 敕令将利用到除第一行之外的 所有行。'$!d' 敕令与之类似。假如敕令是 '$d',则将只把 'd' 敕令利用到文件中的着末一行('$' 地址是指定着末一行的简单要领)。然而,有了 '!' 之后,'$!d' 将把 'd' 敕令利用到除着末一行之外的 所有行。现在,我们所要理解的是这些敕令本身做什么。

两种款式的故事

在查看 QIF 款式之前,先看一下我的 checkbook.txt 款式:

28 Aug 2000   food  -    -    Y   Supermarket       30.94 25 Aug 2000   watr  -    103   Y   Chec澳门新葡新京返水在哪里k 103        52.86

在我的文件中,所有字段都由一个或多个制表符分开,每个买卖营业盘踞一行。日期之后的下一个字段列出支出类型(假如是收入项,则为 "-")。第三个字段列出收入类型(假如是支出项,则为 "-")。然后,是一个支票号字段(假如为空,则照样 "-"),一个买卖营业完成字段("Y" 或 "N"),一个注释和一个美元金额字段。现在,让我们看一下 QIF 款式。当用文本查看器查看下载的 QIF 文件时,它看起来如下:

!Type:Bank D08/28/2000 T-8.15 N PCHECKCARD SUPERMARKET ^ D08/28/2000 T-8.25 N PCHECKCARD PUNJAB RESTAURANT ^ D08/28/2000 T-17.17 N PCHECKCARD SUPERMARKET

浏览过文件之后,不难猜出其款式 -- 轻忽第一行,另外的款式如下:

D

T

N

P

^  (这是字段分隔符)

开始处置惩罚

在处置惩罚象这样紧张的 sed 项目时,不要气馁 -- sed 容许您将数据徐徐改动成终极形式。在进行傍边,可以继承细化 sed 脚本,直到输出与预期的完全一样为止。无需在试第一次时就包管其完全精确。

要开始,起开创建一个名为 "qiftrans.sed" 的文件,然后开始改动数据:

1d /^^/d s/[[:cntrl:]]//g

第一个 '1d' 敕令删除第一行,第二个敕令从输出撤除那些憎恶的 '^' 字符。着末一行撤除文件中可能存在的任何节制字符。既然在处置惩罚外来文件款式,我想打消在半途碰到任何节制字符的风险。到今朝为止,统统顺利。现在,要向该基础脚本中添加一些处置惩罚功能:

后七行有些繁杂,以是将具体评论争论它们。首先,继续应用三个 'N' 敕令。'N' 敕令奉告 sed 将 下一行读入输入中,然后将其附加到当前模式空间。这三个 'N' 敕令导致将下三行附加到当前模式空间缓冲区,现在这一行看起来如下:

28 Aug 2000  OUTY  INNY  nT-8.15nNnPCHECKCARD SUPERMARKET

sed 的模式空间变得很丢脸 -- 必要撤除额外的新行,并履行某些附加的款式化。要这样做,将应用替代敕令。要匹配的模式为:

'nT.*nN.*nP.*'

这将与后面依次跟有 'T'、零或多个字符、新行、'N'、任何数量的字符、新行、'P'、以及任何数量字符的新行匹配。呀!这个规则表达式将与刚刚附加到模式空间澳门新葡新京返水在哪里的三行的整个内容匹配。但我们要从新款式化该区域,而不是全部调换它。美元金额、支票号(假如有的话)和描述必要呈现在调换字符串中。要这样做,我们用带有反斜杠的圆括号括起那些“感兴趣部分&rd澳门新葡新京返水在哪里quo;,以便可以在调换字符串中引用它们(应用 '1'、'2 和 '3' 来奉告 sed 将它们插入到何处)。以下是着末的敕令:

s/nT(.*)nN(.*)nP(.*)/NUM2NUMttYtt3tAMT1AMT/

该敕令将我们的行变换成:

28 Aug 2000 OUTY INNY NUMNUM  Y    CHECKCARD SUPERMARKET   AMT-8.15AMT

虽然该行正变得好一些,然则,有几件事一看就有点...啊...有趣。首先是那个愚笨的 "NUMNUM" 字符串 -- 其目的何在?假如查看 sed 脚本的后两行,就会发明其目的,后两行将把 "NUMNUM" 调换成 "-",而把 "NUM""NUM" 调换成 。如您所见,用愚笨的标记括起支票号容许我们在该字段为空时方便地插入一个 "-"。

您可能还会对下面的文章感兴趣: