1.更多的替换选项
s命令的另外一些选项。
1.1 替换标记
替换命令在替换多行中的文本时能正常工作,但默认情况下它只替换每行中出现的第一处。
要让替换命令能够替换一行中不同地方出现的文本必须使用替换标记。替换标记会在替换命令字符串之后设置。
s/pattern/replacement/flags
有4种可用的替换标记:
形式 | 描述 | |
1 | 数字 | 表明新文本将替换第几处模式匹配的地方; |
2 | g | 表明新文本将会替换所有匹配的文本; |
3 | p | 表明原先行的内容要打印出来; |
4 | w file | 将替换的结果写到文件中; |
其中p替换标记会打印与替换命令中指定的模式匹配的行。通常会和sed的-n选项一起使用,-n选项将禁止sed编辑器输出。但p标记会输出修改过的行,所以将二者结合使用的效果就是只输出被替换命令修改过的行。
w替换标记会产生和p同样的输出,只不过会将输出保存到制定文件中。
sed编辑器的正常输出是在STDOUT中,而只有那些包含匹配模式的行才会保存在制定的输出文件中。
1.2 替换字符
sed编辑器允许选择其他字符来作为替换命令中的字符串分隔符:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
感叹号被用作字符串分隔符,这样路径名就更容易阅读和理解了。
2.使用地址
默认情况下,sed编辑器中使用的命令会作用于文本数据所有行。如果只想将命令作用于特定行或某些行,则必须用行寻址(line addressing)。
在sed编辑器中有两种形式的行寻址:
- 以数字形式表示行区间;
- 用文本模式来过滤出行;
2.1 数字方式的行寻址
在命令中指定的地址可以是单个行号,或是用起始行号,逗号以及结尾行号指定的一定区间范围内的行。
sed '2s/dog/cat/' data1.txt
sed '2,3s/dog/cat/' data1.txt
如果想将命令作用到文本中从某行开始的所有行数据,因此美元符号用起来很方便:
sed '2,$s/dog/cat/' data1.txt
2.2 使用文本模式过滤器
sed编辑器允许指定文本模式来过滤出命令要作用的行,
格式如下:/pattern/command
必须用正斜线将要指定的pattern封起来,sed编辑器会将该命令作用到包含指定文本模式的行上。
2.3 命令组合
如果需要在单行上执行多条命令,可以用花括号将多条命令组合在一起。sed编辑器会处理地址行处列出的每条命令。
sed '2{
> s/fox/elephant/
> s/dog/cat/
> }'data1.txt
3. 删除行
删除命令 d 会删除匹配指定寻址模式的所有行。使用该命令时要特别小心,如果没有加寻址模式的话,流中的所有文本行都会被删除。
注:sed编辑器不会修改原始文件,删除的行只是从sed编辑器的输出中消失了。原始文件仍然保持不变。
4.插入和附加文本
插入(insert)命令(i)会在指定的行前增加一个新行;
附加(append)命令(a)会在指定的行后增加一个新行;
但这两个命令不能在单个命令行上使用。必须指定是要将行插入还是附加到另一行。
格式如下:sed '[address]command\new line'
5.修改行
修改(change)命令(c)允许修改数据流中整行文本的内容。和插入和附加命令的工作机制一样,必须在sed命令中单独指定新行。
6.转换命令
转换(transform)命令(y)是唯一可以处理单个字符的sed编辑器命令。转换命令格式为:
[address]y/inchars/outchars/
转换命令对inchars和outchars值进行一对一的映射。
如: sed 'y/123/789/' data1.txt
转换没那个了是一个全局命令,即它会对文本行中找到的所有指定字符自动进行转换,而不会考虑它们出现的位置。
7.使用sed处理文件
7.1 写入文件
w命令用来向文件写入行,格式为: [address]w filename
filename可以使用相对路径也可以使用绝对路径,但不管是哪种,运行sed编辑器的用户都必须有文件的写权限。
address可以是sed支持的任意类型的寻址方式,例如单个行号,文本模式,行区间或文本模式。
如:sed '1,2w test.txt' data2.txt
将data2.txt文件中的第一行和第二行写入test.txt文件中。
7.2 从文件读取数据
读取(read)命令(r)可以将一个独立文件中的数据插入到数据流中。
格式为:[address]r filename
filename可以使用相对路径也可以使用绝对路径,但不管是哪种,运行sed编辑器的用户都必须有文件的读权限。
address只能指定单独一个行号或文本模式地址。sed编辑器会将文件中的文本插入到指定地址后。
如:sed '3r data12.txt' data5.txt
将data12.txt文件中的内容插入到data5.txt文件的第三行后。
要在文件末尾插入内容用'$'符号代替行号即可。