sed工具介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed工具介绍相关的知识,希望对你有一定的参考价值。

sed工具

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


调用sed命令有两种形式:

sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)


常用选项:

-n∶仅显示script处理后的那一行(或者动作)才会被列出来

-e∶进行多项编辑,即对输入行应用多条sed命令时使用

-f∶指定sed脚本的文件名。直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作

-r∶sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)

-i∶直接修改读取的文件内容,而不是由屏幕输出      


常用命令:

a ∶ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

c ∶ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行

d ∶ 删除,因为是删除,所以 d 后面通常不接任何内容

 i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

 p∶ 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用

 s∶ 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。例如 1,20s/old/new/g 


打印某行

sed -n 'n'p filename        'n'是一个数字,表示行,而-n 选项的作用是只显示要打印的行

# sed -n '2'p passwd

bin:x:1:1:bin:/bin:/sbin/nologin



打印所有行

#sed -n '1,$'p test.txt 

rot:x:o:o:/rot:/bin/bash

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



指定一个区间打印

#sed -n '1,3'p test.txt 

rot:x:o:o:/rot:/bin/bash

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin



打印包含某个字符串的行

#sed -n '/root/'p test.txt 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin



特殊字符(如^、$、.、*等)同样也能在sed中使用

#sed -n '/^1/'p test.txt

1111111111111111111111111111111

# sed -n '/in$/'p test.txt

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

#sed -n '/r..o/'p test.txt

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

#sed -n '/ooo*/'p test.txt

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash



实现多个行为

#sed -e '1'p -e '/111/'p -n /root/grep/test.txt        使用-e

rot:x:o:o:/rot:/bin/bash

1111111111111111111111111111111



删除某些行

参数d表示删除的动作,删除指定的单行以及多行或删除匹配某个字符的行,还可以删除从某一行开始到文档最后一行的所有行,文档内容不变。

#sed '1'd /root/grep/test.txt 

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

#sed '1,3'd /root/grep/test.txt 

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

#sed '/oot/'d /root/grep/test.txt 

rot:x:o:o:/rot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



替换字符或者字符串

s就表示替换的动作,g表示本行全局替换,不加g则只替换本行出现的第一个。

#sed '1,2s/ot/to/g' test.txt            把1、2行ot替换成to

rto:x:o:o:/rto:/bin/bash

operator:x:11:o:operator:/roto:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


除了可以使用/作为分隔符外,我们还可以使用其他特殊字符,例如#和@


删除文所有数字或字母

[0-9]表示任意数字,任意字母[a-zA-Z],任意数字和字母[0-9a-zA-z]

#sed 's/[0-9]//g' test.txt               删除数字

rot:x:o:o:/rot:/bin/bash

operator:x::o:operator:/root:/sbin/nologin

operator:x::o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash


#sed 's/[a-zA-Z]//g' test.txt         删除字母

::::/://

::11:::/://

::11:::/://

::::/://

1111111111111111111111111111111



调换两个字符串的位置

小括号()属于特殊符号,必须在前面加转义字符\,替换时则写成类似\1、\2、或\3的形式,例中用把想要替换的字符打包成了一个整体。

#sed 's/\(rot\)\(.*\)\(bash\)/\3\2\1/'  test.txt           

bash:x:o:o:/rot:/bin/rot                                 

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



不用\,还可以换-r选项

#sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt 

bash:x:o:o:/rot:/bin/rot

operator:x:11:o:operator:/root:/sbin/nologin

operator:x:11:o:operator:/rooot:/sbin/nologin

roooot:x:o:o:/roooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

从这里可以看出,就是这个-r选项让这个表达式更加清晰了。除了调换两个字符串的位置



在某一行前后增加指定内容

#sed 's/^.*$/123&/' test.txt 

123rot:x:o:o:/rot:/bin/bash

123operator:x:11:o:operator:/root:/sbin/nologin

123operator:x:11:o:operator:/rooot:/sbin/nologin

123roooot:x:o:o:/roooooot:/bin/bash

1231111111111111111111111111111111

123aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



直接修改文件的内容

#sed -i 's/ot/to/g' test.txt          改变文件内容,把ot替换成to

rto:x:o:o:/rto:/bin/bash

operator:x:11:o:operator:/roto:/sbin/nologin

operator:x:11:o:operator:/rooto:/sbin/nologin

roooto:x:o:o:/roooooto:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



以上是关于sed工具介绍的主要内容,如果未能解决你的问题,请参考以下文章

Linux centos7 sed工具介绍

文本编辑工具sed

正则介绍 sed

Unix & Linux的文本处理工具 -- grep, sed & awk

linux下的文本处理工具---sed

第9章 文本处理工具sed