5.11. 四种 sed 脚本——对同一个文件的多次编辑——第二部分

未匹配的标注

5.11 四种 sed 脚本——对同一个文件的多次编辑——第二部分

下一个编辑需要移除在行开始的那些空格。匹配这一连串空格的模式非常类似于前一个命令的地址。

s/^□□*//

这个命令移除了在行之前发现的任何空格序列。替换命令的替换部分为空,意味着匹配的字符串被移除。

把这个命令加在脚本里,然后测试它。

➜  ch04 git:(main) ✗ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer  offers three  software packages from the  suite
of Horsefeathers  software products  --  Horsefeathers  Business
BASIC, BASIC  Librarian,  and LIDO.  These software products can
fill  your    requirements    for    powerful,    sophisticated,
general-purpose business  software providing you with a base for
software customization or development.
.LP
Horsefeathers  BASIC is  BASIC optimized for use on  the  BigOne
machine with UNIX  or MS-DOS operating systems.  BASIC Librarian
is a full screen program editor, which also provides the ability

下一个编辑尝试处理添加到每一行中用来对齐的额外空格。写一个替换命令来匹配任何连续的空格,然后把它替换为一个单独的空格。

s/□□*/□/g

这个命令的结尾加了全局标记 g,所以所有的匹配(而不只是第一个)都会被替换。注意,就像前面的正则表达式,不指定有多少个空格,而只是表示为一个或多个。可能有两个、三个或四个连续空格。不管有多少,将它们减少为一个。

这个命令也匹配一个单独的空格。但是因为替换部分也是一个单独的空格,因此这种情况实际上是一个 “no-op”,就是无操作。

测试新的脚本:

➜  ch04 git:(main) ✗ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO. These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems. BASIC Librarian
is a full screen program editor, which also provides the ability

就像前面讲的那样,它把两个或多个空格减少到一个。然而进一步观察,你可能会注意到这个脚本将句号后的连续两个空格移除了,但是它们本来应该属于那里。

可以完善替换命令,那样它就不会对跟在句号后的空格进行替换。这个问题是有时当句号后有三个空格,我们会想将它减少到两个。最好的方法似乎是写一个单独的命令来处理句号后有空格的这种特殊情况。

s/\.□□*/.□□/g

这个命令将空格句号后跟着任何多空格替换为句号后跟着两个空格。需要注意的是,前面的命令将多个空格减少到一个,所以在句号后只有一个空格。

这样的话这个命令可以简化为:s/\.□/.□□/g

然而这个模式不管在空格后有多少个空格都适用,只要至少有一个。(比如,它不会影响这种形式的文件名 test.ext,如果该文件名出现在这个文档中)这个命令被放在脚本的最后,然后测试:

➜  ch04 git:(main) ✗ sed -f sedscr horsefeathers
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN
.LP
DESCRIPTION
.LP
BigOne Computer offers three software packages from the suite
of Horsefeathers software products -- Horsefeathers Business
BASIC, BASIC Librarian, and LIDO.  These software products can
fill your requirements for powerful, sophisticated,
general-purpose business software providing you with a base for
software customization or development.
.LP
Horsefeathers BASIC is BASIC optimized for use on the BigOne
machine with UNIX or MS-DOS operating systems.  BASIC Librarian
is a full screen program editor, which also provides the ability

成功了。这是完整的脚本:

s/^$/.LP/
/^+□□*/d
s/^□□*//
s/□□*/□/g
s/\.□□*/.□□/g

如之前所说,下一步将使用 testsed 对完整文件 hf.product.bulletin 测试这个脚本, 然后仔细地检查结果。当对结果满意后,可以使用 runsed 来持久化更改。

$ runsed hf.product.bulletin
done

通过执行 runsed 我们已经覆盖了原来的文件。

在离开这个脚本之前,需要指出的是,虽然编写这个脚本是用来处理一个特定的文件,但是脚本中每一个命令都可能是你期待重复使用的,即使你不会重复使用整个脚本。换句话说,你可能会编写其它的删除空行或检查句号后跟着两个空格的脚本。识别命令如何可以在其它情况下被重复使用,会减少开发和测试新脚本的时间。就像一个歌手学习一首歌,然后将它加到自己的节目单里面。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~