文本处理三剑客之SED(流编辑器)
sed的工作方式:在指定文件中,按行读取内容至模式空间,然后根据sed的scripts编辑改行内容,编辑完毕后输出至屏幕,再读取下一行进行处理。如果有该行内容未被处理完毕就有新的内容要进行编辑,则把该行内容移至保持空间中,,保持空间中的内容可以随时调回模式空间中。
sed的使用
使用格式:sed [options...] ‘scipts‘ file
- 常用选项:
- -n:不输出模式空间中的内容至标准输出(不自动打印)
- -e script:多点编辑
sed -e ‘s@^#[[:space:]]@space@‘ -e ‘/^UUID/‘ /etc/fatab
- -f sed_script_fie:调用sed的编辑脚本文件(文件中每行一个编辑脚本)
- -r:支持使用扩展正则表达式
- -i:直接编辑源文件
- -i.bak:备份源文件并在原文编辑
地址定界机制:
- 空地址:对全文进行处理
- 单地址
- #:指定第#行
- $:最后一行
- /pattern/:被此模式所匹配到的行
- 地址范围:
- #,#:第#行到第#行
- #,+#:第#行到#+#行
- #,/pattern/:第#行到被模式匹配到的行
- /pattern1/,/pattern2/:第一次被模式1匹配到的行到第一次被模式2匹配到的行
- 步进:~
- 1~2:所有奇数行
- 2~2:所有偶数行
编辑命令:
- d:删除
- p:显示模式空间中的内容
- a \test:在行后面追加文本“test”,支持使用\n实现多行追加
- i \test:在行前面追加文本“test”支持使用\n实现多行追加
追加的时候,要插入变量使用‘‘‘$变量‘‘‘
- c \test:把匹配到的行替换为此处指定的文本
- w file:保存模式空间中的内容至文件中,相当于重定向
- r file:读取指定文件中的内容自己当前文件被模式匹配的行的后面
- =:为模式匹配到的行打印行号
- !:条件取反
- s///:查找替换,其分隔符可自定义,常用的有s@@@,s###等
替换标记:
- g:全局替换
- w file:将替换完的结果保存到指定文件中
- p:显示替换成功的行
支持使用\1,\2...后向引用,&表示全面搜索到的全部内容
练习
- 删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
~]# sed ‘s@^[[:space:]]+@@‘ /etc/grub2.cfg
- 删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
~]# sed ‘s@^#[[:space:]]*@@‘ /etc/fstab
- 在/etc/grub2.cfg文件中包含linux16的行的行尾加上net.ifnames=0
sed -nr ‘/linux16/s/.*/& net.ifnames=0/p‘ /etc/grub2.cfg
sed的高级编辑命令:
- h:把模式空间中的内容覆盖至保持空间中
- H:把模式空间中的内容追加至保持空间中
- g:把保持空间中的内容覆盖至模式空间中
- G:把保持空间中的内容追加至模式空间中
- x:把模式空间中的内容与保持空间中的内容互换
- n:覆盖读取匹配到的行的下一行到模式空间中
- N:追加读取匹配到的行的下一行到模式空间中
- d:删除模式空间中的行
- D:删除多行模式空间中的开始到\n的行
示例:
- sed -n ‘n;p‘ FILE:显示偶数行;
- sed ‘n;d‘ FILE:显示奇数行;
- sed ‘1!G;h;$!d‘ FILE:逆序显示文件的内容; 等价于sed -n ‘1!G;h;$p‘
- sed ’$!d‘ FILE:取出最后一行;
- sed ‘$!N;$!D‘ FILE:取出文件后两行;
- sed ‘N;D‘:取出最后一行;
- sed ‘/^$/d;G‘ FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
- sed ‘G‘ FILE:在原有的每行后方添加一个空白行;
文本处理工具之SED流编辑器
原文:https://blog.51cto.com/13408885/2396004