sed基本用法与正则表达式
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}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?