Sed功能说明:
Sed是linux下一个强大的文本文件处理工具,通过对文件增加、删除、查找、查询操作,配合正则表达式以实现工作中的各种需求。同时也是一名运维人员必须掌握的核心技能。
------------------------------------------------------------------------------------------------------
sed正则表达式:
^ 匹配行开始
$ 匹配行结束
. 匹配一个非换行符的任意字符
* 匹配0个或多个字符
[] 匹配一个指定范围内的字符
[^] 匹配一个不在指定范围内的字符
\(..\) 匹配子串,保存匹配的字符,给替换命令s的\N引用
& 保存搜索字符用来替换其他字符,给替换命令s的&引用
x\{m\} 重复字符x,m次
x\{m,\} 重复字符x,至少m次
x\{m,n\} 重复字符x,至少m次,不多于n次
------------------------------------------------------------------------------------------------------
Sed命令格式:
sed [选项] '范围/命令' 文件
------------------------------------------------------------------------------------------------------
常用选项:
-n 只显示匹配到的内容,通常和p参数配置使用。
-e 同时执行多个命令,另一种实现方式:'命令1;命令2'
-i 执行命令并实际修改文件,如果不使用此选项,sed所有的操作都只是修改内存中的值而已。
------------------------------------------------------------------------------------------------------
常用范围:
1 匹配第1行
1,5 匹配第1行到第5行
/^a/,/c$/p 匹配以a开头到c结尾之间的行
2,$ 匹配第2行到最后1行
1~2 匹配基数行,2表示步进值
2~2 匹配偶数行,2表示步进值
/string/ 匹配包含字符串的行
/[a-z]/ 匹配包含某个范围的行
/^string/ 匹配包含元字符集的行
/正则/ 匹配正则表达式内容的行
------------------------------------------------------------------------------------------------------
常用命令:
s 替换指定内容 格式:'/范围/s/替换内容/新内容/替换范围'
a\ 在行下面插入文本 格式:'范围a\内容'
i\ 在行上面插入文本 格式:'范围i\内容'
c\ 把选定的行改为新的文本 格式:'范围c\内容'
d 删除选择的行 格式:'范围d'
h 拷贝内容到缓冲区 格式:'范围h'
G 获得缓冲区内容并追加 格式:'范围G'
p 打印文件内容 格式:'范围/命令/p'
r 读取file内容显示在范围后 格式:'范围/r file'
w 提取范围里的内容到file里 格式:'范围/w file'
! 匹配与范围相反的内容 格式:'范围!'
------------------------------------------------------------------------------------------------------
替换命令s常用参数:
/ 定界符 格式:'/' 如果旧值包含'/',可以修改/为@或者#或者|等
g 替换范围,N表示第几次匹配 格式:'范围/s/旧值/新值/Ng' 没有N表示全部替换
\N 引用子串,N表示第几个子串 格式:'范围/s/*子串*/\N/g' *表示其它内容
& 引用'#'的内容 格式:'范围/s/#/*&*/g' #表示匹配内容
------------------------------------------------------------------------------------------------------
正则表达式示例:
/^#/ 匹配所有以#开头的行
/sh$/ 匹配所有以sh结尾的行
/s.d/ 匹配s后接一个任意字符接d
/s*ed/ 匹配0个或多个s接ed的行
/[0-9]/ 匹配包含数字的行
/[a-z]/! 匹配不包含字母的行
/[^a-z]/ 匹配不包含全字母的行
/\(sh\)ell/#\1#/ 匹配shell替换为#sh#
/shell/*&*/ 匹配shell替换为*shell*
/s\{5\}/ 匹配包含5个s的行
/s\{5,\}/ 匹配至少有5个s的行
/s\{5,10\}/ 匹配5~10个s的行
------------------------------------------------------------------------------------------------------
常用选项示例:
仅显示匹配到的第1行内容 :sed -n '1p' /etc/passwd
同时执行多个命令 :sed -n -e '1p' -e '/mysql/p' /etc/passwd
执行命令并修改原文件 : sed -i '2d' /etc/rc.local
------------------------------------------------------------------------------------------------------
常用范围示例:
匹配第1行 :sed -n '1p' /etc/passwd
匹配第1到5行 :sed -n '1,5p' /etc/passwd
匹配第2行到最后1行 :sed -n '2,$p' /etc/passwd
匹配奇数行 :sed -n '1~2p' /etc/passwd
匹配偶数行 : sed -n '2~2p' /etc/passwd
匹配包含mysql的行 :sed -n '/mysql/p' /etc/passwd
匹配以a/b/c开头的行 :sed -n '/^[a-c]/p' /etc/passwd
匹配以root开头的行 :sed -n '/^root/p' /etc/passwd
匹配5加至少2个0的行 :sed -n '/50\{2,\}/p' /etc/passwd
------------------------------------------------------------------------------------------------------
常用命令示例:
匹配包含mysql开头的行替换登录权限 :sed -n '/^mysql/s@/bin/bash@/sbin/nologin@p' /etc/passwd
匹配文件第1行并在行前插入###### :sed '1i\######' /etc/passwd
匹配文件第1行并在行后插入###### :sed '1a\######' /etc/passwd
匹配文件第2行并修改为###### :sed '2c\######' /etc/rc.local
匹配文件第2行并删除内容 :sed '2d' /etc/rc.local
拷贝文件第2行并追加到最后1行 :sed '2h;$G' /etc/rc.local
读取resolv内容追加到local最后1行 :sed '$r /etc/resolv.conf' /etc/rc.local
读取local第3到5行内容写到newfile : sed -n '3,5w newfile' /etc/rc.local
匹配文件不包含空行的内容 :sed -n '/^$/!p' /etc/rc.local
------------------------------------------------------------------------------------------------------
替换命令s常用参数示例:
根据实际情况修改定界符 :sed 's@#!/bin/sh@#!/bin/bash@g' /etc/rc.local
从第2次匹配后开始替换 :echo shellshellshell |sed 's/shell/SHELL/2g'
提取子串并反向引用后替换 :echo test is ABc or 111 |sed 's/\([a-Z]\{3\}\) or \([0-9]*\)/*\2* or #\1#/'
保留搜索到的内容并引用 :echo this is test file |sed 's/test/##&##/'
------------------------------------------------------------------------------------------------------
注意:
当sed在脚本中处理替换操作时,如果新内容是引用变量,则需要把单引号修改为双引号
示例:
name=123456
echo "####6543210####"|sed -n "s/[0-9]\+/$name/p"
------------------------------------------------------------------------------------------------------
转载于:https://blog.51cto.com/lsong/1922122