sed编辑器
作者:bin一、什么是sed
sed是一种流编辑器,vim是一种交互式编辑器。
二、使用方法
命令行:sed option script file
-e script 将script添加到已有命令中 -f file 将file文件中的命令添加到已有命令中 -n 不产生命令输出,使用print打印
简单的示例:
$echo "this is a test" | sed 's/test/mini test/' $echo "this is a test "| sed -e 's/test/mini test/; s/is/are/' $sed 's/test/mini test/' file.txt $sed -f script.sed file.txt
三、深入学习sed
1.替换标记s
substitute:s/pattern/replacement/flags
flags有4种可用:
1:数字,表示替换多少次 2:g表示全文替换 3:p表示将原先的内容也打印出来 4:w file.txt 将替换内容写到文件中
vim编辑器%s替换相似,这里不再赘述,仅演示w
sed 's/test/trail/w test.txt' file.txt
2.替换字符
sed运行使用自定义字符作为替换命令中的字符串分隔符 $echo "this is a test" | sed 's/test/mini test/' 等于 $echo "this is a test" | sed 's!test/mini test!' 这样可以免去对一些路径的斜杠进行转换的麻烦
3.寻址
3.1 数字方式寻址
sed '2s/dog/cat/' file.txt 改第2行 sed '2,3s/dog/cat/' file.txt 改第2-3行 sed '2,$s/dog/cat/' file.txt 改第2-最后一行
3.2 文本模式过滤寻址
/pattern/command sed '/pattern/s/dog/cat/' file.txt 仅替换含有pattern行的dog为cat
4.命令组合
如果要在一行使用多条命令,可以使用花括号将命令组合在一起。
sed '2{s/dog/cat/;s/apple/orign/}' file.txt 替换第二行的dog和apple
5.删除行
sed '2d' file.txt 删除第二行
这里也可以类似的使用2,3d或者2,$d等,还可以使用匹配内容
sed '/pattern/d' 删除有pattern的行 sed '/patterna/,/patternb/d' 删除patterna到patternb之间的行,如果patternb不存在,就会一直删到文件结尾
6.头查入和尾附加行
i:Insert,在前一行插入
a: append 在后一行附加
echo "test line 2"|sed 'i\test line 2' 插入 test line 2 至第一行前面
这里也可以类似的使用1i或者3a之类的进行指定行的插入,附加操作
7.修改行
修改(c:change)和插入(i)、附加(a)类似
echo "this is test " | sed 'c\test is end' 这里将第一行替换为test is end
这里也可以类似的使用1c或者3c之类的进行指定行替换
四、sed进阶
1.分支(b)
改变执行流程
sed -n '{:start; s/,//p; /,/b start}' $1
使用b命令添加一个分支,上面的命令使用b命令在匹配到逗号(,)时跳转到:start,如此就实现了一个循环,直到把文章的逗号都删除为止
sed -n '{2,3b; s/dog/cat/}' $1
如此在第2-3行跳过命令,因为2,3b后面没有跟东西
2.测试(t)
与分支(b)类似
sed -n '{:start; s/,//p; t start}' $1
t前面的命令执行成功,那么就会做一个跳转,如这里如果删掉了(,)号,那么就会跳转到start。如此又是一个循环;
3.&符号
使用&符号在替换匹配结果时使用
sed 's/.im/"&"/g' $1
这在替换时使用&表示刚才的匹配 .im 字符,. 代表任意一个字符
这里标识 将 匹配到的 .im 加上双引号 “.im”
这是提取整个字符串,如果想提取匹配的一个字符呢?
sed 's/\(t\)im/\1 ama/g' $1
先用()括起需要使用的子模式字符t,使用\1 的方式对子模式进行访问