文本处理工具sed

时间:2022-11-18 14:38:26

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' [^/] 表示非/ 的字符 别看成/ 开头的了!!