sed是一个行编辑方式,才发现用熟练以后节约了很多时间
注意匹配是'\' 的转意作用
-i 写回源文件
sed -n '2p' tmp 不要单引号其实也可以
sed -n '1,3p' tmp
sed -n '/try/p' tmp
sed -n '1,$p' tmp
sed '/.*ing/p' tmp
sed '$p' tmp
sed -n 's/am/& hahaha/p' tmp 在这个am这个模式的后面加hahaha &保存了发现模式
sed -n 's/am/hahaha &/p' tmp 在这个am这个模式的前面加hahaha 这里的/也可一用:代替
sed -n 's:arm:hahaha &:p' tmp
sed "s/go/$REPLACE/g" 从shell向sed传值用双引号
sed '/try/ a\ xxxxxx\n yyyyyy\n zzzzzzz' funtion_use_shell 附加
sed '/try/ i\ xxxxxx\n yyyyyy\n zzzzzzz' funtion_use_shell 插入
sed '/try/ c\ xxxxxx\n yyyyyy\n zzzzzzz' funtion_use_shell 替代
[address[,address]] s/pattern-to-find/replacemen-pattern/[g p w n]
g全部,否则只替换找到的第一个 p打印,这会跳过-n选项 sed默认打印所有 -n关闭打印 w 文件名 将结果写入相应的文件
sed '1,3d' tmp 删除1到3行
sed -n 's/am/& hahaha/pw tmp1' tmp 将结果写入文件
sed '/am/r tmp1' tmp 读文件
sed '/try/q' funtion_use_shell 退出
5. sed里有模式空间(pattern space)和暂存缓冲区两个概念
sed的处理方式记录:
第一,行处理时,sed工作原理(不考虑暂存缓冲区与N、n等命令):
a) 从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\n
b) sed依据命令对其进行处理
c) 将处理完的打印出来,并在末尾加上\n,shell遇到\n就自动换行
第二,使用N的时候情况如下:
a) 从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\n
b) sed依据命令对其进行处理,遇到N命令时,在模式空间的末尾加上\n,然后将下一行读入进来,追加在刚添加的\n后面,此时模式空间的末尾依然没有\n(至始至终就不会有)
c) 将处理完的打印出来,shell遇到\n时候就自动换行,并在末尾加上\n
1,sed 如果处理多个sed命令,可以用-e,每个-e对应一个sed命令,第一个不用-e,例如sed -n 's/student/p' -e '/student/=' local.c
还有一种方式用";'分号将各个命令隔开如 sed -n 's/student/p;/student/=' local.c,注意虽然前后有两个命令,但是都是对同一个模式 空间进行处理,也就是同一行进行处理
2, 解释sed -n '/student/p' local.c | sed 'N;/\n/: /g'
第一个是在关闭自动打印,然后寻找到模式student所在的行,并打印(p)。然后通过管道传递给第二个sed,第二个sed首先用N 命令读取另外一行到模式空间,然后处理,对照sed处理有N的情况下的处理方式理解
x x为一行号,如 1
x,y 表示行号范围从 x到y,如2,5表示从第 2行到第5行
/pattern/ 查询包含模式的行。例如 /disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行。例如 /disk/disks/
pattern/,x 在给定行号上查询包含模式的行。如 /ribbon/,3
x,/pattern/ 通过行号和模式查询匹配行。 3./vdu/
x,y! 查询不包含指定行号 x和y的行。1,2!