linux最常用命令sed详解
一. 命令概述
sed
是一种流编辑器。它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,也称为模式空间,接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾,文件内容并不会改变。
二. 命令格式
sed [option] 'command' inputFile
三. 常用选项
-n
使用安静模式。在一般sed的用法中,所有的内容一般都会被列出到屏幕上。-n
参数使得只有经过sed特殊处理的那一行才会被列出来。-e
进行多项编辑,即对输入行按照sed命令出现顺序依次应用。比如sed -e '/group/s/if/ifif/g' -e '/group/s/else/elseelse/g' test.txt
表示将匹配group的行中if替换成ifif,else替换成elseelse。-f
直接将sed
的动作写在一个文件内,-f filename
则可以执行filename
内的sed
命令。-r
使得sed
命令支持扩展的正则表达式(默认是基础正则表达式)。-i
直接修改读取的文件内容,而不是由屏幕输出。
四. 常用命令
a\ 后面插入行
sed '1,$a\add one' test.txt
在第一行到最后一行的每一行下面追加"add one"
字符串行。多行字符串可以用\n分隔sed '/first/a\add one' test.txt
在匹配到first行下面追加"add one"
字符串行。
i\ 前面插入行
sed '1,$i\add one' test.txt
在第一行到最后一行的每一行前面追加"add one"
字符串行。
c\ 替换指定行
sed '1,4c\add one' test.txt
将第一行到第4行替换成"add one"
字符串行。
s 替换指定字符
sed 's/line/text/g' test.txt
将所有行的line替换为text,g代表全局选项,没有g只替换所有行的第一个匹配项。sed '/^first.*end$/s/line/text/g' test.txt
匹配以first
开头end
结尾的所有行,然后将line
全部替换为text
sed 's/\(.*\)line$/\1/g' test.txt
括号\(\)
中包裹的内容表示正则表达式的第1个分组,\1
表示前面匹配到的第一个分组,相当于删除所有行行末的linesed 's/re\.\w+/search/g' test.txt
将所有行的能匹配正则re\.\w+
的部分替换成search
。
d 删除指定行
sed '1,4d' test.txt
删除第一行到第四行sed '/first/d' test.txt
删除匹配到first的行sed -r '/function/,/return ret/d' test.txt
删除function
到return ret
的行,即删除函数function。
p 打印指定行
sed -n '/^first.*end$/p' test.txt
以first开头end结尾的所有行全部打印
r 读取文件
sed '/baseurl/r template.txt' redis.conf
将指定文件读取到匹配行后面。
w 写入文件
sed '/baseurl/r template.txt' redis.conf
将匹配到的行写入template.txt文件。
n 移到下一行执行下一个命令
sed '/test/{ n; s/aa/bb/; }' test.txt
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb。sed -n 'p;n' test.txt
打印基数行sed -n 'n;p' test.txt
打印偶数行
五. 使用环境变量
sed '$a\'"$hostname"'' /etc/ansible/hosts
在最后一行添加环境变量hostname
,环境变量需要用双引号,环境变量的前后还需要一个单引号。