3.7. 使用 Sed —— 第一部分

未匹配的标注

使用 Sed —— 第一部分

有两种调用 sed 的方法,在命令行指定你的编辑指令,或者将它们放到一个文件,然后在命令行提供该文件的名称。

指定简单的指令

你可以在命令行上指定简单的编辑命令。

sed [-e] 'instruction' file

-e 选项仅当你在命令行提供多于一个指令时是必须的。它告诉 sed 将下一个参数作为指令。当只有一个指令时, sed 能够自己判断。让我们看一些例子。

使用名为 list 的示例输入文件,下面的例子使用 s 命令来将 “MA” 替换为 “Massachusetts”。

➜  ch02 git:(daily) ✗ sed 's/MA/Massachusetts/' list
John Daggett, 341 King Road, Plymouth Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston Massachusetts

指令替换了三行,但所有行都被显示出来。

用单引号包裹指令并不总是必须的,但是你应该养成总是这么做的习惯。作为包裹的单引号防止 shell 去解释编辑指令中的特殊字符或空格。(shell 使用空格来确定提交给程序的各个参数,对于 shell 来说是特殊的字符在命令调用之前会被扩展。)

比如,第一个例子可以不用单引号。但是在下面这个例子中他们就是必须的。因为替换命令包含了空格。

➜  ch02 git:(daily) ✗ sed 's/ MA/, Massachusetts/' list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston, Massachusetts

为了在城市和州之间放一个逗号。指令将两个字母缩写之前的空格替换为一个逗号和一个空格。

在命令行上指定多个指令,有三种方法:

  1. 用逗号来分割指令。

  2. 在每个指令前放上 -e 的选项。

  3. 使用 Bourne shell[^1] 的多行输入能力,在输入一个单引号之后按下回车,一个二级提示符(>) 将会为多行输入而显示。

    sh-3.2$ sed '
    > s/ MA/, Massachusetts/
    > s/ PA/, Pennsylvania/
    > s/ CA/, California/' list
    John Daggett, 341 King Road, Plymouth, Massachusetts
    Alice Ford, 22 East Broadway, Richmond VA
    Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
    Eric Adams, 20 Post Road, Sudbury, Massachusetts
    Hubert Sims, 328A Brook Road, Roanoke VA
    Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
    Sal Carpenter, 73 6th Street, Boston, Massachusetts

    这个技术在 C shell 中是不成立的。作为替代的,你可以使用在每个指令的末尾使用分号,然后你可以在每行结束前输入反斜杠来在多行上输入命令:

    $ sed '\
    ? s/ MA/, Massachusetts/;\
    ? s/ PA/, Pennsylvania/;\
    ? s/ CA/, California/' list
    John Daggett, 341 King Road, Plymouth, Massachusetts
    Alice Ford, 22 East Broadway, Richmond VA
    Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
    Eric Adams, 20 Post Road, Sudbury, Massachusetts
    Hubert Sims, 328A Brook Road, Roanoke VA
    Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
    Sal Carpenter, 73 6th Street, Boston, Massachusetts

    (或者你可以通过键入 sh 可以临时转到 Bourne shell 然后输入命令。)

在上面的例子中,有五行被改变。当然所有的行都被展示出来。记住输入文件不变。

脚注

脚注1

目前有许多与 Bourne shell 兼容的 shell 都可以这么操作,举几个例子,ksh, bash, pdksh 和 zsh。比如zsh:

➜  ch02 git:(daily) ✗ sed '
quote> s/ MA/, Massachusetts/
quote> s/ PA/, Pennsylvania/
quote> s/ CA/, California/' list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~