sed是一个非交互式文本编辑器,它一次处理一行内容。
作用:编辑一个或多个文件,简化对文件的反复操作、编写转换程序等
在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”,紧接着用sed命令处理缓冲区中的内容,处理完后把缓冲区的内容输出至屏幕或写入文件。默认输出到屏幕的文本已经修改,但文件内容其实没有修改,需要修改文件内容时添加选项-i。
语法格式如下:
sed [-options] [‘commands‘] filename;
参数说明:
选项-n表示隐藏默认输出内容
x:指定一行内容,sed -n '1p' test2.sql显示test2.sql文件的第一行
x,y:指定从x行号到y行号内容,sed -n '2,4p' test2.sql
n选项:读取下一行内容并覆盖当前模式空间
/parttern/:查询包含模式的行,sed -n '/Server version/p' all.sql
/parttern/,/parttern/:查询包含两个模式之间的行
/parttern/,x:从与parttern匹配行到x行号之间的行
q:第一个模式匹配完成后退出
a\:在定位行的下一行添加一行文本信息
i\:在定位行的上一行添加一行文本信息
c\:用新文本替换定位的行(可多行)
d:删除定位行
s:使用模式替换替换相应模式,sed 's/parttern/parttern/g' filename
p打印当前模式空间内容,追加到默认输出之后
P打印当前模式空间开端至\n的内容,并追加到默认输出之前。
h:将模式缓冲区的文本复制到保持缓冲区
H:将模式缓冲区的文本追加到保持缓冲区
x:互换模式缓冲区和操持缓冲区的文本
g:将保持缓冲区的内容复制到模式缓冲区
G:将保持缓冲区的内容追加到模式缓冲区
D命令是删除当前模式空间开端至\n的内容(不再传至标准输出)
示例:
替换a.txt文件的old为new:sed 's/old/new/g' a.txt 一行出现多个old时需要g才能完全替换
打印1~3行内容:sed -n '1,3p' a.txt
打印第1行和第三行的内容:sed -n '1;3p' a.txt
打印匹配行到最后一行的内容:sed -n '/pattern/,$/p' a.txt
删除最后一行:sed '$d' a.txt
删除最后3行:for i in `seq 1 3`;do sed -i '$d' a.txt;done
在第一行下添加一行,内容为add newline:sed '1a\add newline' a.txt
在匹配行添加内容:sed '/partter/a\add newline' a.txt或sed '/partter/aadd newline' a.txt
以test结尾的行行尾追加add:sed 's/test$/&add/' a.txt
在行首添加add:sed 's/^/&add/' a.txt
在包含www的行行首添加add:sed '/www/s/^/add' a.txt
在不包含空行行首添加add:sed '/www/!s/^/&add/' a.txt
多个sed命令组合使用-e参数:sed -e 's/^/&add/' -e 's/$/&./' a.txt
或使用';'分隔sed -e 's/^/&add/;s/$/&./' a.txt
通常而言,sed将待处理的行读入模式空间,脚本中的 命令 逐行进行处理,直到脚本执行完毕,然后该行被输出,模式空间清空,然后重复将待处理的行读入模式空间(即下一行),知道文件处理完毕。
如果用户希望在某个条件下脚本的某个命令被执行,或者希望模式空间得到保留以便下一次的处理。这时可以使用sed的高级语法,sed高级命令可以分为以下3中功能:
1、N、D、P:处理多行模式空间的问题
2、H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑
3、:、b、t:在脚本中实现分支与条件结构
示例:
将文件a.txt内容改为非空行以1行空行隔开:sed '/^$/d;G' a.txt 尝试删除空行,将保持缓冲区的内容追加到模式缓冲区(此时保持缓冲区的内容为空)
将文件a.txt内容改为非空行以2行空行隔开:sed '/^$/d;G;G' a.txt
将文件a.txt内容改为非空行前三行以1行空行隔开:sed '/^$/d;1,3;G' a.txt
将文件a.txt内容改为非空行前三行以2行空行隔开:sed '/^$/d;1,3;G;G' a.txt
删除偶数行:sed 'n;d' a.txt n为读取下一行,然后执行删除命令
删除3的整数倍行:sed 'n;n;d' a.txt n为读取下一行,然后执行删除命令
删除奇数行:sed '1d;n;d' a.txt 1d删除第一行,n为读取下一行,然后执行删除命令
在匹配行之前添加空行: sed '/www/{x;p;x}' a.txt
或sed '/a/i\ ' a.txt
在匹配行之后添加空行: sed '/www/G' a.txt 或sed '/www/a\ ' a.txt
在匹配行前后添加空行:sed 'www/{x;p;x;G} a.txt 或sed -e '/www/i\ ' -e '/www/a\ ' a.txt
每行前添加序号,序号与内容以tab隔开:sed = a.txt|sed 'N;s/\n/\t/g' #=为打印行号,N为将当前读入行的下一行读到当前模式空间,包含'\n',可以添加多个N,即将多行读入当前模式空间。
删除行前后的空格:sed 's/^\s*//;s/\s*$//' a.txt或sed 's/^[\t]*//;s/[\t]*$//' a.txt
删除文件最后2行并显示删除内容:sed '$!N;$!D;' a.txt #不懂
sed 'N;$!P;$!D;$d' a.txt #不懂
两行合并:sed 'N;s/\n/ /' a.txt
或sed '$!N;s/\n/ /' a #$!N;如果不是最后一行,则执行N;