sed 是一个非交互式 的 流编辑器。
所谓非交互式,是指使用 sed 只能在命令行模式下输入命令来编辑文本,不能像 vim 一样进入到工具里面进行文本编辑。
而所谓流编辑器,是指 sed 每次只从文件或标准输入中读入一行,然后对该行进行指定的处理,处理完成之后,接着读入下一行,再进行同样的处理,整个文件像流水一样被逐行处理。
sed 不是在原文件或输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理。
sed 运行过程中维护着两个缓冲区,一个是活动的 " 模式空间(pattern space)",另一个是起辅助作用的 " 保持空间(holding space)"。一般情况下,每当运行 sed,sed 首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间并替换掉模式空间里原来的内容,然后进行处理,以此类推。
sed 是 linux 上一个重要的文本处理工具,经常被用于处理大型的文本文件。
语法:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
选项
-i:直接修改
-e:多点编辑
-n:静默模式,仅显示脚本处理后的结果;
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
参数
sed 命令常搭配正则表达式来对选择到的行进行处理,和 awk 一样,正则表达式要放在两个斜线中,/正则表达式/,也可使用多行模式,'/正则1/,/正则2/action'
a\ 在当前行下方插入文本.
i\ 在当前行上方插入文本.
c\ 把选定的行改为新的文本.
d 删除选择的行.
s 替换指定字符,格式s///.
g 表示行内字符串全部替换.
h 复制模式空间中的内容到保持空间.
H 将模板空间中的内容追加至保持空间.
g 获取保持空间中的内容,并替换模式空间.
G 获取保持空间中的内容,并追加至模式空间后面.
x 模式空间和保持空间中的内容互换.
n 在模式空间中读取当前行的下一行,并只处理下一行,而忽略当前行.
N 在模式空间中读取当前行的下一行,将两行当作一行进行处理.
p 打印模式空间中的行.
P 打印模式空间中的第一行.
r file 从file中读行.
w file 将模式空间中的内容追加至file末尾.
W file 将模式空间中的第一行追加至file末尾.
! 取反.
= 打印当前行号码.
# 添加注释.
栗子
1.合并偶数行到奇数行后面:
sed 'N;s/\n//' file
2.打印偶数行
sed -n 'n;p' file
3.打印奇数行
sed -n 'N;P' file
4.在某些行末尾添加指定内容
sed -i '/export PATH=$PATH/s/$/:\/usr\/local\/python3\/bin/' /etc/profile
5.删除配置文件的注释行
sed -i '/^[[:space:]]*#/d' nginx.conf
6.删除文件中的空白字符
sed -i 's/[[:space:]]//g' syztoo.ini