Sed

前2个月狂写了一堆sed脚本,今天突然发现居然连个基本的语法都忘了,汗啊。
我想再不把Sed的心得写下来的话,估计就得重学一遍了。

文尾附的sed参考手册已经说的很详细了,所以我这里就记些很特殊且重要的内容。
今天先大概记几个,以后再整理(唉,没办法,最近比较懒)

行的指定

命令前不写行选语句则选中所有行

first~step
选择从first行开始的每隔step行
例如:1~2就选中了1,3(1+2),5(3+2), … 行
!
取反,加在行选表达式尾部选中不满足表达式条件的行

预定义的字符类别

[[:space:]] 空格
待扩充

命令

输入输出控制

p
替换成功则把替换后的整个字串输出到stdout
w <filename>
替换成功则把替换后的整个字串写入文件<filename>
r <filename>
读入文件<filename>,插入到输入流的当前行之后

流程控制

n
跳到下一行继续处理(next), 如果没有下一行则退出
d
删除当前行,继续下一行
q
直接退出(处理全部完成)
{cmd1;cmd2;cmd3}
命令组合,对某些行顺序执行多个命令

其他

=
打印行号(打完换行)

s/regexp/replace/flags

g
global
I
ignore case
1
只替换第1个匹配
2
只替换第2个匹配, 依次类推。。。

s/regexp/replace/flags

可用变量

& 整个匹配的字符串
\1 第一个匹配的字串
\2 第二个匹配的字串,依次类推
字串的定义是 用 \( \)包起来的部分,若有重叠按\(顺序记数。

替换出新行

\n, \r等放在替换表达式中sed是不支持的(gnu sed可能可以), 需要在sed脚本里面显式地换一行,而且一定要在换行前加
wrong: s/ab/a\nb/
correct:

s/ab/a\
b/

pattern & hold space

待扩充

单行

  • h
  • g
  • x

多行

  • D
  • N
  • P
  • H
  • G

参考文档

sed_manual.pdf
sed_and_awk.chm

sed
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.