编写sed脚本

sed命令
正则表达式

在脚本中应用命令:shell

替换命令
编程

 s/pig/cow/g安全

 s/cow/horse/gbash

模式空间编辑器

sed维护一种模式空间,即一个工做区或者临时缓冲区,当应用编辑命令时,将在那里存储单个输入行。
ide

注意:一次一行的设计的一个优势是sed在读取很是大的文件时不会出现问题。屏幕编辑程序必须将整个文件读入内存,这将会产生内存溢出或者在处理庞大的文件时速度很是慢。测试

寻址上的全局透视ui

sed是隐式全局的,例以下面的替换命令,将每一个"CA"替换成"California"编码

s/CA/Californai/g

咱们也能够限制只对包含"Sebastopol"的行才将"CA"替换为"California"

Sebastopol/s/CA/California/g

由“Sebastopol”“CA”组成的输入行将匹配这个地址,而且应用替换命令将他替换为“Sebastopol”“California”. 右“San Fracicso”“CA”组成的行不会被匹配,并且不会应用替换命令。

sed命令能够指定零个、一个或两个地址。每一个地址都是一个描述模式。行号或者行寻址符号的正则表达式。

注意:

一、若是没有指定地址,那么命令将应用于每一行。

二、若是只有一个地址,那么命令应用于与这个地址匹配的任意行。

三、若是指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址的第一行,和他后面的行,直到匹配第二个地址的行。

四、若是地址后面跟有感叹号(!),那么命令就应用于不匹配该地址的全部行。


删除命令d
1.一个只有d命令组成,而且没有地址的脚本不会产生输出,由于它删除了全部的行。
2.当行号做为一个地址提供时,命令只影响那一行,例如:1d ,删除最后一行,使用$d
3.当正则表达式做为地址提供时,这个命令只影响与这个模式匹配的行。正则表达式必须封闭在(/)中,下面的删除命令为"/^$/d" :只删除空行。
4.若是提供了两个地址,那么就指定了命令执行的行范围。下面展现了如何删除由一对宏包围的全部行,在这种状况下,.TS和.TE标记了tb1的输入:/^\.TS/,/^.TE/d

      注意:它删除了从第一种模式匹配的行开始,到由第二种模式匹配的行(包括此行在内)为止的全部的行这个范围的行不受影响。

5.下面的命令删除了文件中从行50到最后一行的全部行:50,$d

能够混合使用行地址和模式地址:1,/^$/d 这个示例删除了从第一行直到第一个空行的全部的行,例如,能够用他来删除保存在文件中的Internet邮件消息中的邮件头。

注意:1.能够把第一个地址看作是启用地址,并把第二个地址当作是禁用动做,sed没有办法先行决定第二个地址是否会匹配。一旦匹配了第一个地址,这个动做就将应用于这些行。因而命令应用于“全部”随后的行,直到第二个地址被匹配。,在上例中,若是文件不包含空行,那么将删除全部的行。

2.跟在地址后面的感叹号会反转匹配的意义。例如,下面的脚本将删除在tb1输入块中的那些行之外的全部行。/^\.TS/,/^.TE/!d

命令分组

1.sed使用大括号({})将一个地址嵌入在另外一个地址中,或者在相同的地址上应用多个命令。若是想指定行的范围,而后在这个范围内指定另外一个地址,则能够嵌套地址。例如:为了只删除tb1输入块中的空行,使用下面的命令:/^\.TS/,/^\.TE/{

/^$/d

}

注意:左大括号必须在行末,并且右大括号自己必须单独占一行,而且确保在大括号以后没有空格。

2.可使用大括号将编辑命令括起来对某个范围的行应用多个命令,以下所示:

/^\.TS/,/^\.TE/{

/^$/d

s/^\.ps 10/.ps 8/

s/^\.vs 12/.vs 10/

}

注意:这个示例不只删除了tb1输入块中的空行,并且他还使用了替换命令s,改变了几个troff的请求,这些命令只应用于.TS/.TE块中的行。


测试并保存输出

在前面关于模式空间的讨论中,能够看到sed:

  1. 生成输入行的备份

  2. 修改模式空间中的备份

  3. 将备份输出到标准输出

这些都意味着sed有其内置的安全措施,因此会改变原始的文件。所以,下面的命令行:

sed -f sedscr testfile:不会在testfile中作改动。它将全部的行送往标准输出(通常指屏幕),----包括被修改的行和没有被修改的行。若是想要保存这些输出,就必须将他们输入到一个新的文件中。

sed -f sedscr testfile  > newfile 其中,重定向符号">"未来自sed的输出直接送往文件newfile中。不要未来自命令的输出重定向到输入文件,不然会改写输入文件,甚至可能在sed处理这个文件以前,并破坏你的数据。

检查newfile和testfile文件的差异:

diff testfile  newfile


sed脚本的四种类型

1.对同一文件的多重编辑:sed脚本的第一种类型示范了在一个文件中进行一系列编程工做。咱们使用的第一个示例是将由字处理程序建立的文件转换为用于troff的编码文件。

下面是Horsefeathers Software 产品说明显然须要作的一个编辑工做的列表:

a.用段落宏(.LP)取代全部的空行。要求是匹配空行,可是,在查看输入文件内容时,空行是否有前导空格并不明显。当清楚空格后,它们没有前导空格,因此空行能够采用模式“^$”来匹配。(若是行上有空格,那么模式写成“^[]*$*”)。所以,能够用如下的方法简单的实现:

[root@localhost sed]# cat horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business 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.
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

[root@localhost sed]# sed 's/^$/.LP/' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your
.LP
requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
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/' 注意:用'.LP'来取代每一个空行。在替换命令的替换部分没必要转义字母句点。


b.咱们的第二个编辑操做是删除以"+"开始而且包含行式打印机下划线的行。此处能够用删除命令d只删除这一行。在编写匹配这一行的模式中,咱们能够有许多中不一样的选择,以下的多种形式均可以匹配这一行。

/^+/

/^+[空格]/

/^+[空格][空格]*/

/^+[空格][空格]*—*/

能够看出,每一个正则表达式一次匹配的字符愈来愈多。只有经过测试才能决定须要多复杂的表达式来匹配特定的行而不是其余的行。在正则表达式中定义的模式越长,就越容易使他不会产生不想要的匹配。so,咱们选择了第三种表达式:

[root@localhost sed]# sed '/^+  */d' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business 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.
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

/^+[空格][空格]*/

注意:这个命令删除以加号开始而且后面跟有至少一个空格的任意行。模式中指定两个空格。可是第二个可能每一个 由“*”号修饰,意味着第二个空格能够有也能够没有。

c.删除在行开始位置填充的空格。匹配序列的模式以下:

s/^[空格][空格]*//

注意:这个命令删除在行的开头发现的任意空格序列。替换命令的替换部分为空,这意味着删除了被匹配的字符串。

eg:

[root@localhost sed]# sed 's/^  *//' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________

BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business 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.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

d.处理为了对齐而添加的额外空格。咱们能够编写一个替换命令匹配任意连续空格字符串并用一个空格取代他。

s/ [空格][空格] */[空格]/g

注意:在命令的结尾添加全局标志以便取代全部的出现(不仅是第一个),注意,和前面的正则表达式同样,咱们不能指定有多少空格,可能有一个或者多个,无论有多少,都将他们缩减为一个空格。

友情提示:这个命令还匹配单个空格。可是由于替换的命令也是一个空格,所以有一种状况是实际上“没有工做”。

命令测试:

[root@localhost sed]# sed -e 's/  */ /g'  horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________

 BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business 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.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

上述的表达式有弊端。由于该表达式删除了跟在句点后的两个空格序列,而在这里本应该有两个空格。

so,为了完善替换命令以便他不会替换掉句点后面的空格,问题时句点后面也可能跟有3个空格,则须要将他们删除为2个空格。所以,表达式以下:

s/\.[空格][空格]*/.[空格][空格]/g  此命令能够简化为: s/\.[空格]/[空格][空格]/g

注意:这个命令用后面跟有两个空格的句点,替换了后面跟有任意空格的句点。


总结:

s/^$/.LP/

/^+[空格][空格]*/d

s/^[空格]*//

s/[空格][空格]*/[空格]/g

s/\.[空格][空格]*/.[空格][空格]/g


提取宏定义

       troff宏在宏包中进行定义,它一般是存放在某个目录(例如:/usr/lib/macros)下的一个文件中。troff宏定义老是以字符串'.de'开始,后面跟有可选的空格或者是由一个或者两个字母构成的宏的名字。宏定义在两个句点(..)开始的行处结束。本节的内容是从一个宏包中提取特殊的宏定义(它能够节省你用编辑器定位而且打开文件和搜索想要检查的行的时间)。

    设计此脚本的第一步是:编写提取指定宏的部分。

eg:[root@localhost sed]# sed -n '/^\.deBL/','/^\.\.$/p' /usr/lib/macros/mmt

解释:能够用-n选项来调用sed从而阻止他打印整个文件,使用这个选项,sed只打印经过打印命令显示指定要打印的行。sed脚本包含两个地址:第一个匹配宏定义的开始'.deBL',第二个匹配它的终端,"..",(它自成一行).注意:这两个模式中出现的句点用反斜杠转义。而且这两个地址指定了打印命令p的行范围,这就是搜索脚本与grep(不能匹配行的范围)功能的区别。


在shell脚本中可使用位置符号来指定命令行上的每一个参数:第一个参数是$1,第二个参数是$2.以此类推。

sed -n "/^\.de$1/,/^\.\.$/p" /usr/lib/macros/mmt注意:括住sed脚本的双引号是必须的。若是使用单引号,则shell不对“$1”进行解释。

例子:此脚本能够处理任意个宏包,下面的getmac版本容许用户将宏包的名字指定为第二个命令行参数。

[root@localhost sed]# cat getmac
#!/bin/bash

#getmac - read macro definition for $1 from package $2

file=/usr/lib/macros/mmt
mac="$1"
case $2 in
-ms) file="/work/macros/current/tmac.s";;
-mm) file="/usr/lib/macros/mmt";;
-man) file="/usr/lib/macros/an";;
esac
sed -n "/^\.de  *$mac/,/^\.\.$/p" $file

解释:这里的新内容是case语句,它用于测试$2的值并随后给变量file赋一个值。注意:首先给file赋了一个默认的值。因此若是用户没有指定宏包,那么就会搜索-mm宏包。并且,为了清楚,易懂,$1的值被赋值给了mac。

/^\.de  *$mac/:“.de”和宏的名字之间指定了一个空格,后面跟有一个星号,这意味着这个空格是可选的。


生成提纲

文档例子:

[root@localhost sed]# cat outline.txt
A. Shell Programming
B. Stored Commands
B. Passing Arguments to Shell Scripts
B. Conditional Execution
B. Discarding Used Arguments
B. Repetitive Execution
B. Setting Default Values
B. What We've Accomplished

此脚本须要匹配如下面的宏开始的行

** 章标题(.Se)

** 节标题(.Ah)

** 子节标题(.Bh)

若是咱们须要在那些行上进行替换,用文本标记(例如:A、B)取代宏并添加适当数量的空格(使用制表符)来缩进每一个标题。(记住:"."表示一个制表符)。

s/ "//g         s/[{}]//g

指定全局标志g来捕获一行上的全部出现是必要的。然而,关键是将这个脚本放在脚本的什么位置。若是咱们将他放在脚本的结尾,那么它将在输出行以后删除引号。咱们必须将他放在脚本的起始位置并针对多有的行进行修改,无论他们以后是否在脚本中输出。


编辑工做转移

sed做为真正的流程编辑器,在管道中进行编辑操做,这些编辑操做永远不会被写回到文件中。

下面的命令时将两个连续的破折号转为一个长破折号。

s/--/\\(em/g

咱们在替换字符中用两个反斜杠来表示\(em。由于反斜杠在sed中有特殊的含义。


/---/!s/--/\(em/g        /---/!s/--/\(em/g  file | troff

解释:若是找到含有3个连续的连字符的行,不该用此编辑操做。在全部的其余行上,应用替换命令。后一个表达式的意思是:改变了输入文件而且将输出直接传递到troff,而不用建立一个中间文件。

当一个文档排版时,将连字符换成长破折号不是惟一要作的美化工做。在troff中,能够经过键入两个连续的重音符或者“反引号('')”来表示左引号。键入两个连续的单引号('')来标识右引号。咱们可使用sed将每一个双引号字符换成一个单个的左引号或者单个的有引号。也就是说,当排版时,产生合适的“双引号”。













。。。。。。。。。。。。。。。。

相关文章
相关标签/搜索