您的位置:首页 > 其它

文本处理工具sed

2017-09-08 20:37 197 查看
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
4000
’
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'   [^/] 表示非/ 的字符 别看成/ 开头的了!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sed