您的位置:首页 > 其它

第7章 sed、gawk介绍与正则表达式-----------(sed编辑器基础知识)

2017-04-22 00:00 603 查看

7.3sed编辑器基础知识

成功使用sed编辑器的关键是要了解其大量的命令和格式,这些命令和格式有助于自定义文本编辑。

7.3.1更多替换选项

替换标记要放在替换命令字符串之后:s/pattern/replacement/flags

可用的替换标记有4种:

(1) 数字:表示新文本替换的模式

(2) g:表示用新文本替换现有文本的全部实例

(3) p:表示打印原始行的内容

(4) w file:将替换的结果写入文件

在第一种类型的替换中,可以指定sed编辑器用新文本替换匹配模式的哪一个实例:



指定2作为替换标记的结果是,sed编辑器仅替换每一行中第二次出现的模式。g替换标记替换文本中模式的每一个实例。

p替换标记会打印包含替换命令中匹配模式的那一行。经常和-n选项一起使用,-n选项禁止sed编辑的输出。然而,p替换标记会输出所有已修改的行。二者结合使用生成替换命令已更改的那些行的输出。

w替换标记生成相同的输出,但会将输出保存到指定的文件中。sed编辑的正常输出出现在STDOUT中,只有包含匹配模式的那些行保存在指定输出文件中。



有时候可能在文本字符串中遇到不容易在替换模式中使用的字符。在Linux环境下,如果正斜杠(/)出现在模式文本中,必须使用反斜杠(\)对其进行转义。这常常会导致混淆和错误,未解决这一问题,sed编辑器允许为替换命令中的字符串定界符选择一个不同的字符



7.3.2使用地址

默认情况下,在sed编辑器中使用的命令应用于所有文本数据行。如果仅想将某个命令应用于某一特定的文本数据行或一组文本数据行,则必须使用行寻址

在sed编辑器中,有两种行寻址形式:行的数值范围筛选行的文本模式

两种形式使用相同的格式指定地址:[address] command

也可以将多个命令组和在一起,应用于一个特定的地址:

address {

command1

command2

command3

}

sed编辑器将指定的每一个命令仅应用于指定地址匹配的行。

1.数字式行寻址

使用数字式行寻址时,可以使用行在文本流中的位置应用行。sed编辑器指定文本流中的首行行号为1,每一个新行的行号顺延。

在命令中指定的地址可以是单个行号,也可以是由起始行号、逗号和结束行号($)指定的行范围

操作实例:



上述实例,第一个实例是把第二行的cat替换为black cat;第二个实例是把第二行到第四行这个范围内每行第一次出现的dog替换为black cat;第三个实例把文中的每行第一次出现的dog替换为black cat;第四个实例把第一行到第三行范围内每行第一次出现的dog、love替黄为Dog、I love little cat。

2.使用文本模式筛选器

sed编辑器允许指定为该命令筛选文本行所使用的文本模式。命令格式:/pattern/command。必须用正斜杠(/)标记指定的pattern。sed编辑器仅将该命令应用于包含指定文本模式的行。

sed编辑器仅将这个命令应用于与文本模式匹配的那一行。sed编辑器允许使用正则表达式功能创建复杂的文本模式。正则表达式允许创建高级文本模式匹配各种类型的数据。这些公式可以组合一系列通配符、特殊字符以及固定的文本符号,形成能够匹配几乎所有文本情况的简明模式。



7.3.3删除行

文本替换命令不是sed编辑器可用的唯一命令。如果需要删除文本流中特定的文本行,还有一个删除命令。

删除命令d完成的功能即为删除。它将删除与所提供的寻址模式一致的所有文本行。使用删除命令要小心,因为如果忘记包含寻址模式,所有文本行都将为会从文本流中删除

从数据流中删除特定的文本行,可以按行号、特定的文本行范围、特殊的文件结束符、模式匹配功能



第一个实例删除所有的数据流;第二实例删除第二行的数据;第三个实例删除第二行至第五行的数据;第四个实例删除第二行至结束的数据;第六个实例删除有love的行。

sed编辑器不会处理原始文件。所删除的所有文本行仅从sed编辑器输出中删除。原始文件中的数据保持不变。

可以使用两个文本模式删除若干行,但是要小心。指定的第一个模式打开行删除,第二个模式关闭行删除。sed编辑器将删除指定的这两行之间的所有文本行

只要sed编辑器在数据流中检测到开始模式,删除功能就会随时打开。



第一个实例:遇到dog打开删除,遇到48关闭删除模式,因此在这之间的行都被删除,在输出行为空;第二个实例:遇到dog打开删除,遇到food关闭删除模式,这之间的行被删除;第三个实例:遇到dog打开删除,遇到cat关闭删除模式,因此在这之间的行都被删除,再次遇到dog打开删除,之后没有关闭删除,之后的数据都被删除。第四个实例与第三个类似。

7.3.4插入和附加文本

sed编辑器允许向数据流插入和附加文本:插入命令(i)在指定行之前添加新的一行;附加命令(a)在指定行之后添加新的一行

不能在单命令行上使用这两个命令。必须单独指定要插入或附加的行。实现这一功能的格格式为:

sed '[address] command \

new line'

newline中的文本出现在sed编辑器输出中的指定位置。记住,使用插入命令时,文本出现在该数据流文本之前;使用附加命令时,在数据流文本之后出现文本



在命令行界面提示符下使用sed编辑器时,将得到次提示符以输入新的行数据。必须在这一行上完成sed编辑器命令,因为一旦输入结束单引号,bash shell就会处理该命令。

为在数据流行内部插入或附加数据,必须使用寻址告诉sed编辑器想要数据出现的地方。使用这些命令时只可以指定一行地址。可以以某一数字行号或文件模式匹配,但不能使用地址范围



第一个实例:在第二行之前插入数据;第二个实例:在第二行之后附加数据;第三实例:在第二行数据之后附加两行数据。



第一个实例:在出现dog的行之前插入一行数据;第二个实例:在最后一行之后附加一行数据。

7.3.5更改行

更改行命令(c)允许更改数据流中整行文本的内容。其工作方式与插入和附加命令相同,因此必须独立于sed命令的其他部分指标指定新行。



第一个实例:sed编辑器输出的数据流全部替换为相应的字符串;第二个实例:sed编辑器把第三行替换为相应的字符串;第三个实例:sed编辑器把第二行至第四行合并成一行显示相应字符;第四个实例:sed编辑器把带有dog的行替换为相应的行。

7.3.6变换命令

变换命令(y)是唯一对单个字符进行操作的sed编辑器命令。变换命令使用格式如下:

[address]y/inchars/outchars/

变换命令将inchars和outchars的值进行一对一映射。将inchars中的第一个字符转换为outchars中的第一个字符。将inchars中的第二个字符转换为outchars中的第二个字符。这样的映射一直延续直到完成指定的字符长度。如果inchars和outchars的长度不同,sed编辑器将生成错误消息

变换命令是全局命令,它自动对在文本行中发现的任意字符进行变换,而不管其是第几次出现。



sed编辑器对文本行中匹配字符的实例进行变换,不能限定对字符特定的出现次数进行变换。

7.3.7打印命令

3命令用来打印来自数据流的信息:打印文本行的小写p命令;打印行号的等号(=)命令;列出行的l(小写L)命令

1.打印行

与替换命令的p标记类似,p命令打印sed编辑器输出中的一行。打印命令最常见的用途是打印包含与文本模式匹配的文本行。也可以使用该命令打印数据流中部分行。

打印命令的另一个用途是在改变某行之前查看该行,如利用替换或更改命令。具体的操作实例如下:



第一个实例:打印echo语句要输出的文本信息;第二个实例:输出整个文本内容并把第二行和第三行打印输出;第三个实例:仅打印数据流中的第二和第三行信息;第四个实例:匹配带有dog的行并打印该行信息;第五个实例:匹配带有dog的行打印该行,输出该行信息,然后把该行中第一次出现dog替换为cat,输出替换之后的信息;第六个实例:匹配带有dog的行打印该行,输出该行信息,然后把该行中出现的dog替换为cat,输出替换之后的信息。

2.打印行号

等号(=)命令打印数据流内当前行的行号。行号使用数据流中的换行符确定。每次换行符出现在数据流中时,sed编辑器认为它结束一行文本



使sed编辑器仅显示包含匹配模式的那一行的行号和文本。

3.列出行

列表命令(l)允许打印数据流中的文本和不可打印的ASCII字符。所有不可以打印的字符或使用反斜杠加上八进制值表示,或使用常用的不可以打印字符的标准C样式术语表示,比如用\t表示制表符



7.3.8将文件用于sed

替换命令包含允许处理文件的标记。也有正规的sed编辑器命令允许处理文件而不必替换文件。

1.写文件

w命令用于将文本行写入文件。w命令的格式为:[address]w filename

filename可以指定为相对或绝对路径,但在任意一种情况下,运行sed编辑器的用户对该文件有写的权限地址可以是sed中使用的任意类型的寻址方法,例如单一行号、文本模式或者行号或文本模式范围

如果需要基于常见文本值中从主文件穿件一个数据文件,这是一个很好的工具。



2.从文件读取数据

读命令(r)允许插入包含在独立文件中的数据。读命令格式:[address]r filename

filename参数可以为包含数据的文件指定相对或绝对路径。对于读命令,不能使用地址范围。只能指定单一的行号或文本模式地址。sed编辑器在该地址之后插入文件中的文本。

sed编辑器将数据文件中的所有文本行插入数据流。使用文本模式地址时,工作方式相同。如果要将文本插入数据流末尾,只需要使用美元地址符号($)。

读命令的一个很好的用途是和删除命令一起使用,用另一个文件中的数据替代一个文件中的占位符。

#!/bin/bash
#乘法口诀表
for(( i=1;i<=9;i++ ))
do
for(( j=1;j<=9;j++ ))
do
[ $j -le $i ] && echo -n "$j * $i="$[ $i * $j ]
done
echo " "
done >content

sed '/CONTENT/{
r content
d }' CFKJB


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐