原文在: https://github.com/wen866595/snaprecord/blob/master/shell/learn/sed.md
这里直接把github上的输出拷贝过来,效果不好,可以直接点击上面的链接查看原文。
sed 简介
sed(stream editor)是一个流编辑器,一次处理流的一行内容。
sed 命令模式sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用options
- -n 取消默认输出,只有经过sed特殊处理行(或者动作)才会被列出来。
- -e 多重编辑模式。
- -f 指定sed脚本文件名。
- -i 直接修改文件内容。
地址
地址是用来确定希望编辑的行,可以用数字、正则、美元符($)来表示。也可以用逗号分隔的两个地址来表示希望编辑的范围,这个范围包括这两个地址所在的行。
[起始地址, 结束地址]
举例:
3 // 表示希望编辑第3行。
$ // 表示希望编辑最后那行。
4, 10 // 表示希望编辑4至10行,[4-10]。
2, $ // 表示希望编辑2至最后行,[2-$]。
/href/ // 表示希望编辑含有 href 字符的那些行。
2, /href/ // 表示希望编辑从第2行开始直到并包括第一个含有 href 字符的行。
/meta/,/link/ // 表示希望编辑从第一个含有 meta 字符的行 到 第一个含有 link 字符的行,
中间的行就算没有 meta 或 link 字符也会被命令处理。
正则元字符
因为sed用到很多正则,所以先补充点正则的知识。
^ 表示行的开头。
$ 表示行的结尾。
\ 表示词尾,如 abc\>表示以abc为尾的单词。
. 句点表示任意单个字符
* 星号表示某个字符出现了0次或多次。
[] 字符集合。如[0-9]表示数字0-9中的任意一个,[a-zA-Z]表示字母中的任意一个。
如果字符集以^开头表示非,如[^0-9]表示非数字。
这些正则跟其他编程语言中的正则差不多,除了 \<
和 \>
。
sed 命令
有了前面的基础,就可以学习sed命令并实际运行了。
几乎所有命令都是这样:[address[,address]][!]{cmd}
。address可以是前面提到的定址中的任何一个。
s 替换命令
s 的命令模式是这样的:[address[, address]]s/pattern/replacement/g
sed "s/my/you/g" file // 把file里的 my 替换为 you sed "3,$s/my/you/g" file // 把file里 第3行 到 最后行 的 my 替换为 you sed "3,$s/t/T/3" file // 把file里 第3行 到 最后行 的第三个 t 替换为 T sed "3,$s/t/T/3g" file // 把file里 第3行 到 最后行 的 第三个开始 的 t 替换为 T sed "1,3s/^/head/g" file // 把file里 第1行 到 第3行 的行首加上 head sed "1,3s/¥/tail/g" file // 把file里 第1行 到 第3行 的行首加上 tail sed "s/<[^>]*>//g" file // 去除file的html标签,标签通过正则
<[^>]
*> 匹配, 替换为空也就是删除了。
a 命令和 i 命令
a命令是append,i命令是insert,都可以用来添加行。区别在a是在匹配行后面添加新行,而i是在匹配行的前面添加新行。
命令模式: sed "[address[,address]]i newline" file
, sed "[address[,address]]a newline" file
, i命令后面可以有任意数量的空格符。
举例:
sed "/coderbee/a add new line ." csv.txt
// 在每个包含 coderbee 的行的后面插入 newline 的新行。
sed "1,/coderbee/i add new line ." csv.txt
// 从第1行直到第1个包含 coderbee 的行,在这些行的前面插入 newline 的新行。
c 替换匹配行命令
sed "2c newline" csv.txt
// 把第2行替换为 newlinesed "/coderbee/c newline" csv.txt
// 把第匹配coderbee的行替换为 newline
d 删除匹配行命令
sed "2d" csv.txt
// 把第2行删除sed "/coderbee/d" csv.txt
// 把第匹配coderbee的行删除
p 打印匹配行命令
sed -n "2p" csv.txt
// 打印第2行sed -n "/coderbee/p" csv.txt
// 打印匹配coderbee的行
r/w 读写文件命令
但定位匹配行时,r命令可以读取指定的文件,并把文件的内容输出到输出流中,w命令可以把结果输出到指定的文件。
sed -n "1r tmp" csv.txt
// 用 -n 属性屏蔽掉默认输出,当匹配到第1行时,读取文件tmp的内容到输出流。sed -n "3w tmp" csv.txt
// 用 -n 属性屏蔽掉默认输出,当匹配到第3行时,输出文件tmp的内容。
多个匹配
sed支持匹配多个模式,可以用 -e 选项开启多个匹配。
举例,把file里 [1-3] 行的 my 替换为 you, [3-5]行的 t 替换为 T :sed "1,3s/my/you/g; 3,5s/t/T/g" file
这个也等价于:sed -e "1,3s/my/you/g" -e "3,5s/t/T/g" file
圆括号匹配与变量
圆括号括起来的正则表达式所匹配的字符串可以当成变量来使用,按定义的顺序依次为 \1, \2, ... 。
& 可以当作被匹配的变量,这样可以在被匹配的变量左右加点东西。
通过变量还可以用来从流中抽取特定的值。
echo "abc=123" | sed "s/\([^=]*\)=\(.*\)/\1==\2/g"
// 将得到 abc==123
echo "123456789" | sed "s/5/*&*/g"
// 将得到 1234*5*6789
echo "url='www.google.com'" | sed "s/url='\([^']*\)'/\1/g"
// 将得到 www.google.com
命令打包
命令可以有多个,用逗号分隔,按先后顺序执行,用大括号括起来作为嵌套命令。
echo "abc1231" | sed -n -e "s/a/A/g; s/1/++/g; p"
// 用逗号分隔多个命令,将得到 Abc++23++
echo -e "abc 1\n abc xyz" | sed -n "/abc/{/xyz/p}"
// 嵌套命令,先匹配abc,再匹配xyz,成功后打印,得到: abc xyz
echo -e "abc 1\n abc xyz" | sed -n "/abc/{/xyz/{s/^ *//g; p}}"`
// 嵌套命令,先匹配abc,再匹配xyz,成功后,删除行首的空格,最后打印,得到:abc xyz
相关推荐
Sed学习笔记
linux shell Sed学习笔记.相信你看完会明白的
sed学习笔记,很好的总结,在其它地方淘到的,和大家分享
sed与awk(第二版)学习笔记
根据个人平时多年的学习积累,总结的sed所有用法,包括sed中删除,修改,添加,插入,合并,交换,读入,替换,跳转,标签,转换等高级用法!
根据老男孩老师视频教程《Linux正则表达式实战》的精彩讲解,进行了学习笔记记录,主要讲解Linux三剑客中的grep用法、捎带sed的讲解笔记。 学习笔记进行了规整,相信Linux运维工作者能够一目了然笔记的内容。 (1...
学习linux的笔记,发到博文了,鉴于文档方便保存和查阅,发出来,免费的哈 博文来自http://blog.csdn.net/wklken,共12篇,类似手册,可快速练习和查阅,容易上手 文档列表: Linux笔记——vim常用操作及扩展补充...
压缩包里包含有一个word文档,说我平时使用sed命令的记录,一个学习笔记,还有一个sed使用手册。sed是个强大的流编辑器,灵活使用可以减少很多麻烦。
第7章 sed、gawk介绍与正则表达式 120 7.1 sed编辑器 120 7.1.1 在命令行中定义编辑器命令 120 7.1.2 在命令行中使用多个编辑器命令 121 7.1.3 从文件读取编辑器命令 121 7.2 gawk程序 122 7.2.1 gawk命令格式 122 ...
学习shell时做的笔记,包含sed,awk,sort,uniq的使用
《Unix Shell 实例精解》学习笔记 第一章 关于UNIX Shell的介绍 第2章 UNIX工具箱 第3章 grep家族 第4章 流编辑器(sed) 第5章 awk 实用程序:awk作为一种UNIX工具 第6章 awk实用程序:awk编程结构 ...
shell编程宝典非常实用的shell编程开发资料,详细的sed,awk。grep的用法。
本笔记参考书籍《sed 与 awk(第二版)》书中的重点部分基本都已记录在笔记中。 笔记摘录了书中较多示例,以及来自网络的示例辅助学习。 笔记中的示例已制作成文件存放在 testfile 文件夹中,可上传至 ...
第二列按数值大小排序 第二列相同的再按第一列的字母顺序的逆序排序(-r) 第一步所有行变为一行,这一步使用tr 是因为tr里面可以直接识别换行符,而sed不可以
正规表示法并不是一个工具程序, 而是一个字符串处理的标准依据,如果您想要以正规表示法的方式处理字符串,就得要使用支持正规表示法的工具程序才行, 这类的工具程序很多,例如 vi, sed, awk 等等。 一、正则...
这个是我在学习Linux的时候做的思维导图笔记,主要是Linux的一些基础知识。免费提供下载,学习分享。 该文档分为以下几个部分: 1.shell语法:包含格式化输入输出、数组定义、变量定义方法、运算方法、流程控制、...
本文主要来学习一下JavaScript插件–弹出框。 案例 为页面内容添加一个小的覆盖层,就像iPad上的效果一样,为页面元素增加额外的信息。 先来看几个简单的静态案例效果图 效果比较简单主要就是静态的弹出的小窗体,...
目录实战1、批量替换指定文件的指定内容涉及知识点:基础语法、grep 数据搜索、awk 数据提取、sed 数据修改。# 当然, grep 可以直接得到文件名的,这里作为演戏,先得到默认的匹配内容,然后使用awk处理得到文件名...