首页 > 代码库 > Sed与Awk 学习笔记

Sed与Awk 学习笔记

  1. Sed简介

Sed 是面向数据流的行编辑器。流编辑器[1]工作方式如下图,被编辑文本和编辑命令作为输入传到流编辑器, 编辑器根据编辑命令修改文本并输出结果。

??

??

??

??

??

??

??

??

??

注1:文本编辑器主要分为两类,第一类是我们平时使用的可见即所得的全屏幕编辑器,如 vim,记事本、Word等。全屏幕编辑器一、是可以在文件的任意位置进行编辑,

操作十分简便;二、是所见即所得,可以随时查看编辑结果;以上两种优点使得现有的编辑器几乎都属于这一类。尽管全屏幕编辑器有诸多优点,它也存在一定的缺陷,就是很难使用编程语

言自动处理多个文件。第二类编辑器是行编辑器以及由行编辑器演化而来的流编辑器,Sed 就是属于第二类编辑器。第二类的编辑器的

  1. Sed 基本用法:

Sed 命令和其他Linux 命令的用法基本相同,基本格式如下:

sed OPTIONS... [SCRIPT] [INPUTFILE...]

Sed 常用命令:

sed [-n][-e] ‘command‘ file(s)

sed [-n] -f scriptfile file(s)

Command的格式:[address[,address]][!]command [arguments]

  1. 红色部分代表命令执行的范围,命令中可以有也可以没有。如果命令中不包含地址,则表示命令执行范围是所有行。
  2. 地址的具体构成如下:
  3. ??

    ??

    ??

    ??

    ??

    ??

    ??

??

??

??

??

??

??

最后,如果在地址之后加 ! 表示地址范围取反。

例: 

---------------------数字标示行------------------------

1:表示第一行

5:表示第五行;

1~2:表示13579 …… 的数列

$:标示末行

??

---------------------正在表达式标示行--------------------

/abc/:包含abc字符串的行

/^[a-b][0-9a-zA-Z]*/:在行首以字母开头数字和字母组成的字符串

\%/[0-9]*/%:包含两条斜线中间是数字的字符串的行

??

--------------------逗号分割标示范围行-------------------

13:第一行到第三行

2,$:第二行到最后以后

2/abc/:第二行到首次遇到字符串abc的行

/abc/,14: 首次遇到字符串abc的行到14

3+5:第3行之后的5行即345678

/abc/,+3:首次遇到字符串abc的行之后的3

4~3:第4行到首次遇到3的倍数行即,456

/abc/,~3:首次遇到字符串abc的行到之后首次遇到3的倍数行

-------------------地址取反-----------------------

1!:除了第一行之外的所有行

25!除了第2行到第5行之外的所有行

/abc/!除了包含abc之外的所有行

??

-----------------------------------------------------

??

  1. Command 表示执行的具体命令					
  2. ????????????????????????????					

    ::label,标志一个label,用于b/t的跳转

    =[address]= 打印出行号

    a[address]a\ append text to this line.

    b[address[,address]]b[label] 条件分支语句

    c[address[,address]]c\ 替换内容

    d[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern

    D[address[,address]]D 删除multiline pattern中的第一行,不读入下一行

    g[address[,address]]g hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除

    G[address[,address]]G hold space中的内容appendpattern space\n

    h[address[,address]]h pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除

    H[address[,address]]H pattern space中的内容appendhold space\n

    i[address]i\ address行的前面插入文字,和a反义

    l[address[,address]]l 打印pattern space中的内容,不可打印字符打印出ascii

    n[address[,address]]n 输出pattern space中的内容,读入下一新行替换掉原来的行

    N[address[,address]]N 读入下一行形成multiline pattern,用于跨行处理

    p[address[,address]]p 打印出pattern space中的内容

    P[address[,address]]P 打印出multiline pattern space中的第一行

    q[address]q 碰到address行时退出sed script

    r[address]r file 将文件file的内容appendpattern space

    s[address[,address]]s/pattern/replace/[flag] pattern替换成replace.

    ????????flag:

    ????????n:替换第n个出现的pattern,默认是第一个出现的pattern

    ????????g:全部替换pattern

    ????????p:如果替换成功则打印

    ????????w file:将替换的行写入到文件里

    t[address[,address]]t [label] 如果替换成功则跳转

    w[address[,address]]w file pattern中的内容追加写到file文件

    x[address[,address]]x 交换hold spacepattern space的内容

    y[address1[,address2]]y/abc/xyz/ abc转换为对应的xyz

??

例:

??

??

??

??

Sed官方资料

Sed与Awk 学习笔记