2019-04-04浏览量:395

Linux三剑客之-sed使用

一、简介

sed:是一个编辑器,是一个强大的文件处理工具。

sed作用:用来替换、删除,更新文件中的内容。sed能自动处理一个或多个文件。

sed原理:sed以文本的行为单位进行处理,一次处理一行内容。首先sed把当前处理的行存储在临时缓冲区中(称为模式空间pattern space),接着处理缓冲区中的行,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,这样不断的重复,直到文件末尾。处理完文件的最后一行后,sed便结束运行。

因为sed是对文件中每行在临时缓冲区中的副本进行编辑,所以原文件内容并没有改变,除非重定向输出。

二、sed命令的基本模式

sed  [-参数]  '命令'  输入文本

1.1 sed常见参数:

-n  安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行

-e  多重编辑,且命令顺序会影响结果,可执行多个sed命令

-f  指定一个 sed 脚本文件到命令行执行,-f filename则可以执行filename的sed动作

-r  使用扩展正则表达式,默认支持

-i  直接对输入文档的内容进行修改,不在屏幕上输出

1.2 sed常见命令

a\  在当前行后添加一行或多行

i\   在当前行之前插入文本

c\  用新文本修改(替换)当前行中的文本

d   删除行

p   打印行

s   用一个字符串替换另一个

g   在行内进行全局替换

三、文件的增删改查

数据源:nl /etc/passwd|head -n 10 > sed.txt

3.1 增

增,注意针对文件行处理,指增行的增加,主要分为行前/后增加两种。

3.1.1 指定行之前增加行

命令: sed '2i \\t第二行之前增加的第一行\n\t第二行' sed.txt

注意:新增加的行的开头需要增加空格,需要使用“反斜线”做分割标记

3.1.2 指定行之后增加

命令1: sed '2a 第二行之后增加的第一行\n第二行' sed.txt

注意:sed默认是支持正则表达式的

命令2:sed '1,3a 每行的后面都增加一行' sed.txt

3.2 删

删,即行的删除。主要是指定行的删除,满足某些条件的行的删除

[python@localhost ~]$ sed '1d' sed.txt   # 删除第一行

[python@localhost ~]$ sed '$d' sed.txt    # 删除最后一行

[python@localhost ~]$ sed '/^\s*$/d' sed.txt   # 删除空白行

[python@localhost ~]$ sed '4,$d' sed.txt  # 删除第4到最后一行


[python@localhost ~]$ sed '/root/d' sed.txt  # 删除能匹配 ‘root’ 的行

[python@localhost ~]$ sed '/root/,$d' sed.txt  # 从能匹配到’root’字符串的行到最后一行删除。

3.3 查

[python@localhost ~]$ sed -n '3p' sed.txt  # 只输出第3行

[python@localhost ~]$ sed -n '3,5p' sed.txt  # 输出第3~5行

[python@localhost ~]$ sed –n -e '3,5p' -e '7p' sed.txt  # 输出第3~5,7行

# 注意多重编辑–e的使用。


[python@localhost ~]$ sed -n '/root/,/adm/p' sed.txt 查看包含’root’的行到包含’adm’的行

[python@localhost ~]$ sed -n '/^\s*[0-9]*\s*r/p' sed.txt  # 第一个单词是以’r’开头的单词

注意正则表达式的使用

^:开头;

 \s:制表符,换行符,空格等;

*:匹配0个或多个前导字符;

[]:匹配字符集合里的任一字符。

 

3.4 改

改,即对文件的更改。sed一个强大的功能就是对文件进行修改。

 

3.4.1 行替换

[python@localhost ~]$ sed '1c 行替换' sed.txt  # 第一行替换成 ‘行替换’

[python@localhost ~]$ sed '1,4c 多行替换' sed.txt  # 第1~4行内容替换成 ‘多行替换’ 


3.4.2 局部替换

格式:sed 's/要替换的字符串/新的字符串/g' 

注意:1.要替换的字符串可以用正则表达式

          2.s///表示只替换匹配的第一个字符,s///g表示全部匹配

[python@localhost ~]$ sed 's/root/new_root/' sed.txt  # s///表示只替换匹配的第一个字符

[python@localhost ~]$ sed 's/root/new_root/g' sed.txt  # s///g表示全部匹配


[python@localhost ~]$ sed 's/[ ][ ]*/:/g' sed.txt  # 替换两个或多个空格为分隔符:

[python@localhost ~]$ sed 's/\s//g' sed.txt  # 删除所有的空格

[python@localhost ~]$ sed 's/\s//g' sed.txt |sed -r 's/^(.)(.)/\2\1/g'  # 替换第一个和第二个字母

注意-r的使用

[python@localhost~]$ sed 's/\s//g' sed.txt |sed –r 's/^([a-Z0-9]+)([^a-Z0-9]+)(.+)([^a-Z0-9]+)([a-Z0-9]+)/\5\2\3\4\1/g'  # 替换第一个和最后一个单词。


[python@localhost ~]$ sed -n '/root/p' sed.txt |sed 's/:/_/g'  # 使用管道符,在某行内替换

四、一些细节

4.1 关于 –i

sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个100万行的文件,你要在第100行加某些文字,此时使用vim可能会疯掉!因为文件太大了!那怎办?就利用sed啊!透过sed直接修改/取代的功能,你甚至不需要使用vim 去修订!

[python@localhost ~]$ sed -i '$a # This is a test' sed.txt  # 直接在文件中修改

[python@localhost ~]$ cat sed.txt

4.2 关于sed 中的变量 双引号

[python@localhost ~]$ aa='rxxt'

[python@localhost ~]$ sed "s/root/$aa/" sed.txt  # 双引号,使用变量

五、结束语

上面仅列举了一些sed常见的命令,如果想要熟练使用sed,那就不妨也创建一个测试数据,进行测试吧。

下一篇

版权所有 上海锐翌生物科技有限公司 沪ICP备16022951号