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工具介绍的主要内容,如果未能解决你的问题,请参考以下文章