sed使用扩展正则表达式

sed即Stream Editor,和vi不同,sed是行编辑器。

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

Sed 基本用法

格式:

sed  [-Options]   'script;script;...'  filename

其中script是一个sed命令,sed命令一定要被包含在一对单引号中,可以是多个

常用选项:

-n    不自动打印

-e 多点编辑

-f 从指定文件中读取编辑脚本

-r,-E    使用扩展正则表达式

-i.bak 备份文件并原处编辑

-s 将多个文件视为独立文件,而不是单个连续的长文件流

注:

-ir  不支持

-i  -r  支持

-ri  支持

-ni  危险选项,会清空文件

script命令格式:地址(比如哪些行)+命令(比如增删改查)

1.不给地址:对全文进行处理 (默认自动打印)

P  打印当前模式空间的内容,追加到默认输出之后(不取消自动打印会重复打印)

-n      关闭默认打印 

2. 单地址

#:指定的行

sed -n '3p' passwd  

$:最后一行  

sed -n '$p'  passwd

/pattern/:被此模式所能够匹配到的每一行

打印 etc/fstab 非#号行 :sed -n '/^[^#]/p' /etc/fstab

3.地址范围

#,#  从第#行到第#行,如3,6 从第3行到第7行

seq 10 | sed -n '3,6p'

#,+#  从第#行到第+#行,如3,+4 从第3行到第7行

/pat1/ ,/ pat2/    打印以d开头的行到以s开头的行

sed -n '/^d/,/^s/p' /etc/passwd

4.步进:~

  1~2  奇数行

  2~2  偶数行

命令:

Ip  忽略大小写输出

d  删除模式空间匹配的行,并立即启用下一轮循环

a [\]test  在指定行后面追加文本,支持使用\n实现多行追加

多行追加

 

i [\]test  在行前面插入文本

c [\]test  替换行为单行或多行文本

w file    保存模式匹配的行至指定文件

sed -n '/^b/w ./sedleatn/sed.log'  /etc/passwd

r  file  读取指定文件的文本至模式空间中匹配到的行后

=    为模式空间中的行打印行号

正则表达式  

.    代表且只能代表一个字符
\    转义字符。例\.就只代表本身
*    重复0个或多个前面的一个字符,例o*匹配没有o,有1个o或多个oooooo
.*   匹配所有字符
^word   匹配以world开头的内容 vi/vim 里面^代表一行的开头
word$   匹配以word结尾的内容 vi/vim 里面$代表一行的结尾
^$     表示空行
[abc]   匹配字符集合内的任意一个字符[a-zA-Z],[0-9]
[^abc]   匹配不包含^之后的任意一个字符的内容
a\{n,m\}   重复n到m次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{n,\}      重复至少n次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{n\}     重复n次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{,m\}      最多m次

+    表示重复“一个或一个以上”前面的字符(*是0或多个)
?     表示重复“0个或一个”前面的字符(.是有且只有1个)
|     表示同时过滤多个字符串
()      表示分组过滤,后向引用

shell

name="gengxiaonuo"
${变量}    返回变量值
${#变量}    返回变量长度,字符长度     11
${变量:start}  返回变量start数值之后的字符,且包含start的数字  比如${name:4} --xiaonuo
${变量:start:length}    提取start之后的length限制的字符  比如:${name:4:4} --nuo
${变量#word}  从变量开头删除最短匹配的word子串 比如${name#g*n}-- gxiaonuo
${变量##word}  从变量开头,删除最长匹配的word   比如${name##g*n}  -- uo
${变量%word} 从变量结尾开始删除最短的word 
${变量%%word}  从变量结尾开始删除最长匹配的word

${变量/pattern/string}   用string代替第一个匹配的pattern
${变量//pattern/string}  用string代替所有的pattern

扩展变量

如果parameter变量值为空,返回word字符串
${parameter: -word}
如果para变量为空,则word替代变量值,且返回其值
${parameter : =word}
如果para变量为空,word当作stderr输出,否则输出变量值用于设置变量为空导致错误时,返回的错误信息
${parameter : ?word}
如果para变量为空,什么都不做,否则word返回
${parameter :+word}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值