目录
sed是一种流编辑器,用于对输入流(文件或来自管道的输入)执行基本的文本转换。虽然在某些方面类似于允许脚本编辑(如ed)的编辑器,sed的工作方式是只对输入进行一次传递,因此效率更高。sed在管道中过滤文本的能力是它与其他类型编辑器的特别之处。
OPTION:
-e 告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-i 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-f 后跟保存了sed脚本文件
向匹配行**后**面插入内容
- # 每行后面都追加hello
- sed 'ahello' example
- # 指定行后面追加hello
- sed '2ahello' example
- # 1-3行后面追加hello
- sed '1,3ahello' example
- # 从第1行开始,每隔2行追加hello
- sed '1~2ahello' example
- # 反向(上面匹配行之外的行)
- sed '1~2!ahello' example
- # 除了1-2行之外的行追加hello
- sed '1,2!ahello' example
- # 匹配行后面追加hello
- sed '/131/ahello' example
- # 匹配行取反
- sed '/131/!ahello' example
- # 最后行追加hello
- sed '$ahello' example
向匹配行**前**面插入内容(插入的位置和a分别为一前一后)
可以理解为替换,也可以理解为change(修改);使用过sed命令的同学可能会有疑问sed的替换不是s吗?s替换的是关键字、也可以是行,但是c只能替换行。
- # 每一行都替换为hello
- sed 'chello' example
- # 指定行替换为hello
- sed '2chello' example
- # 1-3行整体替换为一行hello
- sed '1,3chello' example
- # 从第1行开始(含),每隔1行替换为hello
- sed '1~2chello' example
- # 反向(上面匹配行之外的行)
- sed '1~2!chello' example
- # 除了1-2行之外的每一行替换为hello
- sed '1,2!chello' example
- # 匹配行后面追加hello
- sed '/131/chello' example
- # 匹配行取反
- sed '/131/!chello' example
- # 最后行追加hello
- sed '$chello' example
尝试将regexp与数据流匹配。如果成功,将匹配的部分替换为replacement。替换可以包含特殊字符&,用于指向匹配的模式空间的哪一部分,而特殊转义\1到\9用于指向regexp中相应的匹配子表达式。
- # 默认只替换每行的第一个匹配
- sed 's/aaa/131/' example
- # 替换每行所有的匹配
- sed 's/aaa/131/g' example
- # 替换每行第二个匹配
- sed 's/aaa/131/2' example
- # 每行匹配到的第二个aaa,替换为1234,然后将变更行写入(覆盖)到test1文件
- # 也就是说test1里的内容跟sed -n的回显一致(下面的命令-n并不必要,且在s///中-n只有在如下场景下才有效)
- sed -n 's/aaa/1234/2pw test1' example
- # 匹配有‘#’号的行,替换每行第二个aaa为1234
- sed '/#/s/aaa/1234/2' example
- # 每行最后3个字符替换为END
- sed 's/...$/END/g' example
- 同
- sed 's/.\{3\}$/END/g' example
- # 将每行的第一个数字前后加小括号
- sed 's/^\s*//;s/[0-9]/(&)/' example
通过s///g替换的方式删除行,会留下空行,而//d不会。
但是,d只支持//一种正则匹配结构,而s可以使用s|||等任意特殊字符。
- sed '/^\s*#.*/d' example
- 等同于:
- sed 's/^\s*#.*//g;/^$/d' example
- # 删除所有行
- sed -n 'd' example
- # 删除指定行
- sed '2d' example
- # 删除1-3行
- sed '1,3d' example
- # 删除1-5行中匹配到131的行
- sed '1,5{/131/d}' example
- # 从第1行开始(含),每隔1行删除1行
- sed '1~2d' example
- # 反向(上面匹配行之外的行)
- sed '1~2!d' example
- # 除了1-2行之外的每一行替换为hello
- sed '1,2!d' example
- # 匹配行后面追加hello
- sed '/131/d' example
- # 删除空行
- sed '/^$/d' example
- # 删除匹配行以及下一行(如果匹配行不止一行,还挨着,就不会删除最后一行匹配行的下一行)
- sed '/131/,+1d' example
- # 删除匹配行到最后一行
- sed '/131/,$d' example
- # 匹配行取反删除
- sed '/131/!d' example
- # 最后行追加hello
- sed '$d' example
p 必须和-n选项配合,否则会打印所有行。
- #打印文件中的第4行内容
- sed -n '4p' example
- #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长(打印偶数行)
- sed -n '2~2p' example
- #打印文件的最后一行
- sed -n '$p' example
- #打印1到3行
- sed -n '1,3p' example
- #打印从第3行到最后一行的内容
- sed -n '3,$p' example
- #逐行读取文件,打印匹配aaa的行
- sed -n '/aaa/p' example
- #逐行读取文件,打印从匹配china的行到第4(匹配到的第一行开始算)行的内容
- sed -n '/aaa/,4p' example
- #打印第一行到匹配aaa(除第一行外第一个匹配行)的行
- sed -n '1,/aaa/p' example
- #打印从匹配aaa的行及其向后一行(如果匹配的aaa行连续,则以最后一个匹配行为准)
- sed -n '/aaa/,+1p' example
- #打印从匹配内容aaa到匹配内容134的行,如果/134/没有匹配到内容,则打印从aaa到最后一行
- sed -n '/aaa/,/134/p' example
- # 打印最后一行行号
- sed -n "$=" example
- # 打印匹配行行号(多行匹配,则打印多行行号)
- sed -n "/aaa/=" example
- # 打印行号及其内容
- sed -n "/aaa/{=;p}" example
r 要配合-i选项才会写入文件
- # 将文件1 读取到文件2
- sed 'r 1' 2
- 等同于
- sed '$r 1' 2
- 等同于
- cat 1 >>2
- # 在文件2的第3行后插入文件1的内容
- sed '3r 1' 2
- # 在文件2匹配的行后插入文件1的内容(如果匹配多行,则在多个匹配行之后插入文件1的内容)
- sed '/file1/r 1' 2
w 配合-n参数无输出,所以不能带-n。
- # 将文件2的内容写入文件3,如果3不存在则创建;如果存在则覆盖原有内容
- sed 'w 3' 2
- # 将文件1的第一行和最后一行写入文件3
- sed -e '1w 3' -e '$w 3' 1
- # 将文件1的第一行和最后一行分别写入文件2、3
- sed -e '1w 2' -e '$w 3' 1
- # 将文件1中匹配到的aaa和aa行写入文件3
- sed -n '/aaa\|aa/w 3' 1
- # 将文件1中,匹配行到最后一行都写入到文件3(这里的匹配行是从第一个匹配行开始)
- sed -n '/aaa/,$w 3' 1
- # 将文件1中,匹配行及其后2行写入到文件3(这里的匹配行是从最后一个匹配行开始)
- # 如果匹配行后面没有那么多,直接到最后一行
- sed -n '/file/,+2w 3' 1
- # ^锚定行的开始如
- /^sed/匹配所有以sed开头的行。
- # $锚定行的结束
- /sed$/匹配所有以sed结尾的行。
- # .匹配一个非换行符的字符
- /s.d/匹配s后接一个任意字符,然后是d。
- # *匹配零或多个字符
- /*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
- # []匹配一个指定范围内的字符
- /[Ss]ed/匹配sed和Sed。
- # [^]匹配一个不在指定范围内的字符
- /[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
- # \(..\)保存匹配的字符
- s/\(love\)able/\1rs,loveable被替换成lovers。
- # &;保存搜索字符用来替换其他字符
- s/love/**&**/,love这成**love**。
- # \<;锚定单词的开始
- /\
- # \>;锚定单词的结束
- /love\>/匹配包含以love结尾的单词的行。
- # x\{m\}重复字符x,m次
- /0\{5\}/匹配包含5个o的行。
- # x\{m,\}重复字符x,至少m次
- /o\{5,\}/匹配至少有5个o的行。
- # x\{m,n\}重复字符x,m-n次
- /o\{5,10\}/匹配5--10个o的行。