shell四剑客之sed

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;

h选项说明

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值