Linux学习-Sed 命令
sed 命令
-
sed 的模式空间
-
sed 工作方式
- 将文件以行为单位读取到内存(模式空间)
- 使用 sed 的每个脚本对改行进行操作
- 处理完成后输出该行
-
sed 的替换命令 s:
- sed 's/old/new/' filename
- sed -e 's/old/new/' -e 's/old/new/' filename -e 表示多个文件进行操作
- 可简写:sed 's/old/new/;s/old/new/' afile bfile ...
- sed -i 's/old/new/' 's/old/new/' filename -i 表示替换完后原样的写回原文件
-
带正则表达式的替换命令s:
- sed 's/正则表达式/new' filename
- sed -r 's/扩展正则表达式/new' filename
- sed '/s/(aa)|(bb)/!' filename 匹配分组,aa或bb
- +符号也属于扩展表达
-
若被替换的内容中含斜线,可以把分隔符换成其他字符
- sed 's!/!abc!' filename
-
sed 的回调用法
- bfile 的内容:axyzb
- sed -r 's/a.*b/\1 \1/' bfile 输出:axyzb axyzb
上面 \1代表对a.*b调用,若有两组数要调用,则写成 \1 \2
-
-
sed 命令加强版
-
全局替换
- s/old/new/g g为全局替换,用于替换所有出现的次数
- “/” 如果和正则匹配的内容有所冲突,可换为其它符号,如 “!”
-
s/old/new/标志位
- s/old/new/2、s/old/new/3,后面的数字表示匹配第几个,第一个默认不写
- g,全局替换
- p 打印模式空间的内容
- sed -n 'script' filename 阻止默认输出
- sed -n 's/root/!!!!/p' 只输出匹配成功的这一行
- w file 将模式空间的内容写入到文件
- sed -n 's/root/!!!!/w /tmp/a.txt'
-
寻址
- 默认对每行进行操作,增加寻址后对匹配的行进行操作
- /正则表达式/s/old/new/g
- 行号s/old/new/g 行号可以是具体某一行,也可以是最后一行 $ 符号
- sed '1,3s/old/new/' 1到3行
- sed '1,$s/old/new/' 1到最后一行
- sed '/root/s/old/new/' 在root这一行进行匹配替换
- 可以使用两个寻址符号,也可以混合使用行号和正则表达式
- sed '/^bin/,$s/old/new/' 以bin开头,到这行结尾进行匹配替换
- 寻址可以匹配多条命令
- /regular/
- 默认对每行进行操作,增加寻址后对匹配的行进行操作
-
sed 脚本文件
- sed -f sedscript filename
-
-
sed 的其他命令
-
删除命令: [寻址]d 删除模式空间的内容,改变脚本的控制流,读取新的输入行,意味着d后面的指令是不会执行的。
- sed '/ab/d' afile 注意,匹配到ab时,d 指令是删除整一行
-
追加插入和更改:a 追加,i 插入,c 更改
- sed '/ab/i hello' afile 在afie文件匹配到ab,则在ab所在行的上一行插入hello;把i改为a,则是在下一行进行插入;改成c,则把匹配的所在行改写成指定字符串
- sed '/ab/r afile' bfile 将文件afile中的内容,匹配到ab的行,读取到bfile文件中;r命令改为w,则变成写入;在整个语句后面使用">",则会保存到一个新文件中。
-
退出命令q与打印p,哪个效率更高
- sed '10q' filename 读取文件的前十行,然后退出
- sed -n '1,10p' filename 读取文件的前十行进行打印,然后退出
- 因为sed的工作模式是逐行读取到内存再操作,'10q',是一次性读取,然后退出;'1,10p'是10行逐行读取后,再操作,最后退出;
-
-
sed 的多行模式
- 多行模式处理命令:N,D,P
- 为了应对配置文件是多行的情况
- N:将下一行追加到模式空间
- D:删除模式空间中的第一个字符到第一个换行符
- P:打印模式空间中的第一个字符到第一个换行符
- .符号在 sed 中支持多行模式,可以替代\n
您对以上内容有何建议或意见,请写下来告诉我,谢谢!!!