Sed全称叫Stream Editor,是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
sed: 模式空间
默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;
- sed 命令格式和选项说明
sed [options] 'command' file(s)
-
option 常用选项
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-r 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
sed -f /path/to/scripts file
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -
commands[sed常用命令] 解释说明
a 追加,在指定行后添加一行或多行文本*
c 取代指定的行
d 删除指定的行*
D 删除模式空间的部分内容,直到遇到换行符\n结束操作,与多行模式相关
l 打印不可见的字符
n 清空模式空间的内容并读入下一行
N 不清空模式空间,并读取下一行数据并追加到模式空间*
p 打印模式空间内容,通常p会与选项-n一起使用*
P(大写) 打印模式空间的内容,直到遇到换行符\n结束操作
q 退出Sed
r 从指定文件读取数据
s 取代,s#old#new#g==>这里g是s命令的替代
i 插入,在指定行前添加一行或多行文本* -
高级命令:
h 把模式空间的内容复制到保持空间
H 把模式空间的内容追加到保持空间
g 把保持空间的内容复制到模式空间
G 把保持空间的内容追加到模式空间
x 交换模式空间和保持空间的内容 -
sed替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式) \1 子串匹配标记 & 已匹配字符串标记sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
匹配行结束,如:/sed /匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^]匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
& 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。
\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love>/匹配包含以love结尾的单词的
- sed实例
sed –n ‘2p’ /etc/passwd 打印第二行内容
sed –n ‘1,4p’ /etc/passwd 打印第一到第四行内容
sed –n ‘/root/p’ /etc/passwd 打印
sed –n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 同时执行多个文本
sed ‘/root/a\superman’ /etc/passwd 在root所在行行后插入superman
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed ‘/^$/d’ file 删除空白行
sed ‘1,10d’ file 删除1行到10行
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n ‘s/root/&superman/p’ /etc/passwd 单词后
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
[root@Centos6.9~]#sed -n "s/root/superman&/p" /etc/passwd
supermanroot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/supermanroot:/sbin/nologin
1、删除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf 如果没有 / 可以用/d 来删除
2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、删除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
4、删除/etc/inittab文件中开头的#号;
sed 's@^#@@g' /etc/inittab
5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取出一个文件路径的目录名称;
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g' [^/] 表示非/ 的字符 别看成/ 开头的了!!