sed: Stream EDitor, 行编辑器,简介
基本工作模式【sed 命令默认打印匹配到的内容到屏幕】:按照给定的脚本命令,按行读取文本中的内容,读取到pattern space空间中进行编辑操作,未完成的编辑操作放到hold space 空间中,pattern space 再处理其他行,再次处理编辑时,就会从hold space 读取到pattern space 空间中进行编辑,编辑完成后,进行输出
sed 用法
- 格式:sed [option]... 'script' inputfile...
- script:'地址命令'
- 常用选项
- -n:不输出模式空间(pattern space)中的内容至屏幕;
- -e: 多点编辑,可以在一个 sed 命令中实现多个编辑操作
- -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取脚本
- -r:支持使用扩展正则表达式
- -i :源文件中编辑;修改原文件
- 地址编辑
- 1、不给地址:对全文进行按行编辑
- 2、单地址
- # :指定的行
- /pattern/ :被此处模式所能够匹配的每一行
- 3、地址访问
- # , # :第# 行到第#行
- 例子:[root@localhost ~]# sed '1,8d' /etc/fstab
- 例子:[root@localhost ~]# sed '1,8d' /etc/fstab
- #,+#:从#行开始,到#行之后+#的行数
- /pat1/ , /pat2/:从匹配到pat1,到pat2的行
- # , /pat1/ :从#行开始,到匹配到/pat2的行
- # , # :第# 行到第#行
- 4、~ : 步进
- 1~2
- 2~2
- 编辑命令:
- d: 删除 【删除符合要求的行数】
- 例子: [root@localhost ~]# sed '/^UUID/d' /etc/fstab
- 例子: [root@localhost ~]# sed '/^UUID/d' /etc/fstab
- p: 显示模式空间中的内容【sed 命令默认会打印匹配到内容到屏幕上,所以这里会打印两边】
- 例子:[root@localhost ~]# sed '/^UUID/p' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/p' /etc/fstab
- a \text:在行后面追加文本;支持使用\n实现多行追加
- 例子:[root@localhost ~]# sed '/^UUID/a hao \n haode ' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/a hao \n haode ' /etc/fstab
- i \text:在行前面插入文本;支持使用\n实现多行插入
- 例子:[root@localhost ~]# sed '/^UUID/i hao \n haode ' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/i hao \n haode ' /etc/fstab
- c \text:替换符合条件的行为单行或多行文本
- 例子:[root@localhost ~]# sed '/^UUID/c hao \n haode ' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/c hao \n haode ' /etc/fstab
- w /path/to/somefile: 保存模式空间匹配到的行至指定文件中
- 例子:[root@localhost ~]# sed '/^UUID/w /tmp/ab.txt ' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/w /tmp/ab.txt ' /etc/fstab
- r /path/from/somefile:读取指定路径文件的文本流至模式空间中匹配到每一行的行后面
- 例子:[root@localhost ~]# sed '/^UUID/r /tmp/text.txt' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/r /tmp/text.txt' /etc/fstab
- d: 删除 【删除符合要求的行数】
- =: 为模式空间中的行打印行号
- 例子:[root@localhost ~]# sed '/^UUID/=' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/=' /etc/fstab
- !: 取反条件【对地址边界取反】
- 例子:[root@localhost ~]# sed '/^UUID/!d' /etc/fstab
- 例子:[root@localhost ~]# sed '/^UUID/!d' /etc/fstab
- s///:支持使用其它分隔符,s@@@,s###
- 例子:[root@localhost ~]# sed 's@UUID@&woc@' /etc/fstab #在找到的内容后追加
- 例子:[root@localhost ~]# sed 's@UUID@woc@' /etc/fstab #直接替换
- 替换标记:
- g: 行内全局替换
- p: 显示替换成功的行
- w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
- 例子:[root@localhost ~]# sed 's@UUID@&woc@' /etc/fstab #在找到的内容后追加
练习:
- 删除/etc/grub2.cfg 文件中所有以空白开头的行行首的空白字符
- [root@localhost grub]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
- echo一个绝对路径给sed命令,取出其目录名
- [root@localhost grub]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
- [root@localhost grub]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
高级编辑命令【hold space:保持空间进行操作】
- h: 把模式空间(pattern space)中的内容覆盖至保持空间(hold space)中
- H:把模式空间(pattern space)中的内容追加至保持空间(hold space)中
- g: 从保持空间取出数据覆盖至模式空间(pattern space)
- G:从保持空间取出内容追加至模式空间(pattern space)
- x: 把模式空间(pattern space)中的内容与保持空间(hold space)中的内容进行互换
- n: 读取匹配到的行的下一行至模式空间(pattern space)
- N:追加匹配到的行的下一行至模式空间(pattern space)
- d: 删除模式空间(pattern space)中的行
- D:删除多行模式空间(pattern space)中的所有行
例子:
- 显示偶数行:[root@localhost tmp]# sed -n 'n;p' /tmp/number.txt
- 逆向显示文件内容:[root@localhost tmp]# sed '1!G;h;$!d' /tmp/number.txt
- 去除文件后两行:[root@localhost tmp]# sed '$!N;$!D' /tmp/number.txt
- 取出文件最后一行:[root@localhost tmp]# sed '$!d' /tmp/number.txt
- 每一行追加空白:[root@localhost tmp]# sed -n 'G;p' /tmp/number.txt
- 把多个空白行合并为一个空白行:[root@localhost tmp]# sed '/^$/d;G' /tmp/number.txt
- 显示奇数行:[root@localhost tmp]# sed 'n;d' /tmp/number.txt