Sed工具

目录

Sed编辑器——流编辑器

s替换行

替换标记

替换字符

使用地址来优化sed

1.以数字形式表示行区间寻址

2.用文本模式来过滤出行

d删除行

i插入和 a附加文本

c修改行

y转换

p打印行

处理文件

1.w写入文件

2.r读取命令


Sed编辑器——流编辑器

把当前处理的行

存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把

缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

文件内容并没有改变

 

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在

一个命令文本文件中。 sed编辑器会执行下列操作。

(1) 一次从输入中读取一行数据。

(2) 根据所提供的编辑器命令匹配数据。

(3) 按照命令修改流中的数据。

(4) 将新的数据输出到STDOUT

重要的是,要记住, sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到

STDOUT。如果你查看原来的文本文件,它仍然保留着原始数据

语法

sed option script file
optin 描述
-e script 在处理输入时,将script中指定的命令添加到已有的命令中
-f file 在处理输入时,将file中指定的命令添加到已有的命令中
-n 不产生命令输出,使用print命令来完成输出

-e 指定需要使用的多个命令

使用 -e 时命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格

sed -e 's/brwon/green/;    s/dog/cat/'  data.txt

-f 指定需要使用的命令文件

在该文件中存放要执行的命令即可 ,并且命令之后不需要使用分号

换行即可

s替换行

s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式

[root@localhost fuxi]# echo "This is a test" | sed 's/test/big test/' 
This is a big test

替换标记

替换命令在替换多行中的文本时能正常工作,但默认情况下它只替换每行中出现的第一处

要让替换命令能够替换一行中不同地方出现的文本必须使用替换标记

4种替换标记

  • 数字,表明新文本将替换每行第几处模式匹配的地方;
  • g,表明新文本将会替换所有匹配的文本;
  • p,表明原先行的内容要打印出来

        p替换标记会打印与替换命令中指定的模式匹配的行,通常配合-n 选项使用

        -n选项会进制sed编辑器的输出,但p替换标记会输出修改过的行

  • w file,将替换的结果写到文件中

替换字符

由于正斜线通常用作字符串分隔符,如果它出现在模式文本中则必须通过反斜线来转义

在下面的例子中使用!来替代/

[root@localhost fuxi]# sed -n 's!/bin/bash!/bin/cah!p' /etc/passwd
root:x:0:0:root:/root:/bin/cah
kaka:x:1000:1000:kaka:/home/kaka:/bin/cah

使用地址来优化sed

默认情况下,在sed编辑器中使用的命令会作用于文本数据的所有行。

如果只想将命令作用于 特定行或某些行,则必须用行寻址

寻址方式

  • 以数字形式表示行区间
  • 用文本模式来过滤出行

使用相同的语法来指定地址

[address] command
或
address {
	command1
	command2
	command3
}
来对特定地址执行多条命令

1.以数字形式表示行区间寻址

 

sed编辑器会将文本流中 的第一行编号为1,然后继续按顺序为接下来的行分配行号

在命令中指定的地址可以是单个行号,或是用起始行号、逗号以及结尾行号指定的一定区间范围内的行

sed '2s/dog/cat/' data1.txt 
sed '2,3s/dog/cat/' data1.txt

如果想将命令作用到文本中从某行开始的所有行,可以用特殊地址——美元符$

sed '2,$s/dog/cat/' data1.txt

2.用文本模式来过滤出行

另一种限制命令作用到哪些行上的方法会稍稍复杂一些。 sed编辑器允许指定文本模式来过滤

出命令要作用的行

语法

/pattern/command

必须用正斜线将要指定的pattern封起来

例如只想修改用户redhat的默认shell,可以使用sed命令

sed -n '/redhat/s/bash/csh/p'  /etc/passwd

d删除行

删除命令d名副其实,它会删除匹配指定寻址模式的所有行。使用该命令时要特别小心,

如果你忘记加入寻址模式的话,流中的所有文本行都会被删除

sed '2,3d' data.txt

记住, sed编辑器不会修改原始文件。你删除的行只是从sed编辑器的输出中消失了。原始文 件仍然包含那些“删掉的”行

#删除有shasha的行
sed '/shasha/d' data.txt

也可以使用两个文本模式来删除某个区间内的行,但这么做时要小心。你指定的第一个模式会

“打开”行删除功能,第二个模式会“关闭”行删除功能。 sed编辑器会删除两个指定行之间的所

有行(包括指定的行)

#删除1到3行
sed '/1/,/3/d' data.txt

i插入和 a附加文本

插入(insert)命令 (i)会在指定行前增加一个新行。

附加(append)命令 (a) 会在指定行后增加一个新行。

它们不能在单个命令行上使用。你必须指定是要将行插入还是附加到另一行

#语法
sed '[address] command newline'

echo "Test Line 2" | sed 'i\Test Line 1'
Test Line 1
Test Line 2

echo "Test Line 2" | sed 'a\Test Line 1'
Test Line 2
Test Line 1

c修改行

修改( change)命令允许修改数据流中整行文本的内容。它跟插入和附加命令的工作机制一

样,你必须在sed命令中单独指定新行

同样的兼容数字和文本地址

[root@localhost fuxi]# cat data.txt 
This is line number 1
This is line number 2
This is line number 3
This is line number 4
[root@localhost fuxi]# sed '3c\This is a changed line of text' data.txt
This is line number 1
This is line number 2
This is a changed line of text
This is line number 4
[root@localhost fuxi]# sed '/number 3/c\This is a changed line of text' data.txt
This is line number 1
This is line number 2
This is a changed line of text
This is line number 4

注意:

1.通过文本地址修改时会匹配所有行修改

2.sed编辑器会用这一行文本来替换数据流中的两行文本,而不是逐一修改这两行文本

也就是使用数字地址 比如 sed '1,3c\ haha'  data.txt

当匹配到一到三行中有一行符合要求 这三行会被替换为一行

y转换

转换( transform)命令( y)是唯一可以处理单个字符的sed编辑器命令

#语法
[address] y/inchars/outchars/

转换命令会对inchars和outchars值进行一对一的映射。 inchars中的第一个字符会被转换为

outchars中的第一个字符,第二个字符会被转换成outchars中的第二个字符。这个映射过程

会一直持续到处理完指定字符

p打印行

除了使用p标记和替换命令显示sed编辑器修改过的行。另外有3个命令也能用来打印数据流中 的信息

  • p命令用来打印文本行;
  • 等号( =)命令用来打印行号;
  • l(小写的L)命令用来列出行

 

1.跟替换命令中的p标记类似, p命令可以打印sed编辑器输出中的一行

[root@localhost fuxi]# cat data.txt 
This is line number 1
This is line number 2
This is line number 3
This is line number 4
[root@localhost fuxi]# sed -n '/number 3/p' data.txt 
This is line number 3

2.打印行号

等号命令会打印行在数据流中的当前行号。行号由数据流中的换行符决定。每次数据流中出现一个换行符, sed编辑器会认为一行文本结束了

打印行号方便寻找文本

举个例子 在文件中寻找 number 4

sed -n '/number 4/{

>=

>p
}' data.txt

将会输出这一行的行号和内容

3.列出行

列出( list)命令( l)可以打印数据流中的文本和不可打印的ASCII字符。任何不可打印字符

要么在其八进制值前加一个反斜线,要么使用标准C风格的命名法(用于常见的不可打印字符),比如\t,来代表制表符

[root@localhost fuxi]# cat petdata.txt 
dog	cat	bird	fish
[root@localhost fuxi]# sed -n 'l' petdata.txt 
dog\tcat\tbird\tfish$

制表符的位置使用\t来显示。行尾的美元符表示换行符

处理文件

1.w写入文件

#语法
[address] w filename

[root@localhost fuxi]# sed '1,2w test.txt' data.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
[root@localhost fuxi]# cat test.txt 
This is line number 1
This is line number 2

 filename可以使用相对路径或绝对路径,但不管是哪种,运行sed编辑器的用户都必须有文件 的写权限。地址可以是sed中支持的任意类型的寻址方式,例如单个行号、文本模式,区间或文本模式如果你不想让行显示到STDOUT上,你可以用sed命令的-n选项。

2.r读取命令

之前了解了如何在sed命令行上向数据流中插入或附加文本。读取(read)命令( r)允许你 将一个独立文件中的数据插入到数据流中

#语法
[address] r filename

filename参数指定了数据文件的绝对路径或相对路径。你在读取命令中使用地址区间,只能指

定单独一个行号或文本模式地址。 sed编辑器会将文件中的文本插入到指定地址后

你可能感兴趣的:(Shell,linux,运维,shell,xshell)