免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2914 | 回复: 6
打印 上一主题 下一主题

sed 命令 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-18 16:13 |只看该作者 |倒序浏览
看书的时候觉得还可以,所以就抄一下给大家。

在下面的列表中,sed命令是按功能分组的,并且进行了简单的介绍。全面的介绍在后面。(本来觉得很简单就不写了,但是觉得下面的分类方法还不错,具体命令的解释看详细的就好了,书翻译的很让人呕吐。)

(1)基本的编辑
a\       在一行后追加文本
c\        代替文本(通常一个文本块)
i\         在一行前插入文本
d         删除行
s         执行替代
y         转换字符(和unix的tr相似)

(2)行信息
=        显示一行的行号
l          以ascii形式显示控制字符
p         显示该行

(3)输入/输出处理
n        跳过当前行并且到下面的行
r         将另一个文件的内容读到输出流
w       将输入行写到另一个文件
q        退出sed脚本(没有进一步的输出)

(4)移出和放置
h        拷贝到保持空间,清除原有内容
H        拷贝的保持空间,追加到原有内容后面
g        从保持空间恢复,清除目标行
G        从保持空间恢复,追加到模式空间
x         交换保持空间和模式空间的内容

(5)分支命令
b        分支到标号或脚本尾
t         和b相似,但只在替代后分支
:label  有b或t分支到的标号

(6)多输入处理
N        读输入的另一行
D        删除知道内嵌的换行符
P        输出知道内嵌的换行符


按字母顺序概述sed命令
---------------------------
#         #
            在sed脚本中开始一个注释。只在第一行的第一个字符才有效。
---------------------------
:      :label
            标记一行用于b或t控制转移。标号最多可以包含7个字符
---------------------------
=      [/pattern]=
            将有pattern定位的每行的行号写到标准输出
---------------------------
a          [address]a\
            text
            追加text到由address匹配的每行的后面。假如text超过一行,必须在换行符前用反斜杠\对它们加以隐藏。text通过第一个不按这个方式隐藏的换行符来结束。该text在模式空间中无效,并且后续的命令不可能应用到它。不管在模式空间的当前行发生了什么,当完成编辑命令的列表时,这个命令的结果会发送到标准输出。
        示例
        $a\
             This goes after the last line in the file\
             (marked by $).This text is escaped at the\
             end of each line,except for the last one.
---------------------------
b          [address1[,address2]]b[label]
            无条件转移控制到脚本中的:label处。也就是,在label后的命令是应用到当前行的下一条命令。假如没有指定label,则控制直接到脚本的尾部,因此不再有命令应用到当前行。
        示例
        # Ignore tbl tables;resume script after TE:
            /^\.TS/,/^\.TE/b
------------------------------------------------------------

论坛徽章:
0
2 [报告]
发表于 2005-10-18 16:38 |只看该作者

sed 命令

---------------------------------
c             [address1[,address2]]c\
               text
               用text代替(更改)由地址选择的行。当指定了行的范围时所有的行为座位一个整体被text的一个拷贝替代。实际上模式空间的内容被删除,并且没有后续的编辑命令可以应用到模式空间(或text)。
          示例
            # Replace first 100 lines in a file:
                  1,100\c
                  \
                 <First 100 names to be supplied>
-----------------------------
d             [address1[,address2]]d
               从模式空间中删除选定的行。因此该行不会被传递到标准输出。读一个新的输入行,并且用脚本中的第一个命令恢复编辑。
          示例
            #delete all blank lines:
                  /^$/d
------------------------------
D            [address1[,address2]]D
              删除由N命令创建的多模式空间的第一部分(直到内嵌的换行符),并且有脚本中的第一个命令重新恢复编辑。假如这个命令清空了模式空间,则读入一个新的输入行,如同执行d命令一样。
         示例
            #Strip multiple blank lines, leaving only one:
                  /^$/{
                  N
                  /^\n$/D
                  }
------------------------------
g                [address1[,address2]]g
                  将保持空间中的内容粘回模式空间中,清除模式空间原先的内容。示例显示了一个拷贝行的简单方法。
            示例
            这个脚本收集了所有包含单词Item:的行,并且将它们拷贝到文件中一个最近的位置标记处,覆盖该位置标记:
            /Item:/H
                  /<Replace this line with the item list>/g
--------------------------------
G                [address1[,address2]]G
                  和g相似,只是一个换行符和保持空间被粘贴到模式空间的结尾而不是覆盖它。示例显示了一个剪切和粘贴行的简答办法。
            示例
            这个脚本收集了所有包含所有单词Item:的行,并且将它们移到文件中一个位置标记的后面。原先的Item:行被删除。
            /Item:/{
                  H
                  d
                  }
                  /Summary of items:/G
--------------------------------
h               [address1[,[address2]]h
                 拷贝模式空间到保持空间,即一个特殊的临时缓冲区。保持空间中原先的内容被删除。可以在编辑一行前用h去保存它。
           示例
            #Edit a line;print the change;replay the original
                   /Unix/{
                   h
                   s/.* Unix \(.*\) .*/\1:/
                   p
                   x
                   }
                   示例输入:
               This describes the Unix ls command.
                      This describes the Unix cp command.
                   示例输出:
               ls:
                      This describes the Unix ls command.
                      cp:
                      This describes the Unix cp command.
-----------------------------
H                   [address1[,address2]]H
                     追加一个换行符,然后追加模式空间的内容到保持空间中。即使保持空间是空的,H仍旧追加一个换行符。H就像是一个递增的拷贝。示例参考g和G。
------------------------------------------------------------------------

论坛徽章:
0
3 [报告]
发表于 2005-10-18 16:53 |只看该作者

sed 命令

i           [address]i\
            text
            在匹配address的每行前插入text
            示例:
         /Item 1/i\
             The five items are listed below:
-----------------------------
l           [address1[,address2]]l
            列出模式空间的内容,用ascii代码显示控制字符。长行被折叠。
-----------------------------
n          [address1[,address2]]n
            读下一个输入行到模式空间。当前行被发送到标准输出,并且下一行变成当前行。控制传递给后面为n的命令而不是脚本的顶端重新开始的命令。
        示例
          在ms宏中,一个节的头出现一个.NH宏下的行上。为了输出头文件的所有行,用sed -n 调用这个脚本
          /^\.NH/{
               n
               p
               }
--------------------------------
N            [address1[,address2]]N
              追加下一个输入行到模式空间的内容中,这个新行和模式空间的内容由一个换行符分隔开(这个命令的原意是允许模式匹配超过两行)。用\n去匹配内嵌的换行符,可越过多行去匹配模式。参见D的示例.
              示例
          和n下的示例相似,但要一起输出.NH行和头标题:
              /^\.NH/{
                     N
                     p
                     }
               连续两行(用空格替换行符)
            /^\.NH/{
                  N
                  s/\n/ /
                  p
                  }
--------------------------------
p              [address1[,address2]]p
                输出选定的行。要注意的是这可能会导致重复输出,除非用命令行使用#n或-n来禁止默认输出。通常用在改变流控制(d、n、b)的命令前并且可以阻止当前行的输出。参见h,n,N下的示例。
--------------------------------

论坛徽章:
0
4 [报告]
发表于 2005-10-18 17:16 |只看该作者

sed 命令

P          [address1[,address2]]P
            输出由N命令创建的多行模式空间的第一部分(直到内嵌的换行符)。假如N不被应用到一个行的话p一样。
        示例
        假如有两种格式的函数:
            function(arg1, arg2)
                  function(arg1,
                                arg2)
           下面的脚本改变参数2,而不用考虑它是否和函数名出现在同一行上。
            s/function(arg1, arg2)/function(arg1,XX)/
                  /function(/{
                  N
                  s/arg2/XX/
                  P
                  D
                  }
---------------------------------
q             [address]q
               当遇到address的时候退出。和由先前的r或a命令追加到它的内容中的任何文本一道,选定的行首先写到输出设备上(假如默认输出没有禁止的话)
          示例
          删除选定的行后面的所有内容:
             /Garbled text follows:/q
               只输出一个文件的第一个50行:
             50q
---------------------------------
r             [address]r file
              读file中的内容并将其追加到模式空间的内容之后。在r和文件名之间必须要有一个空格。
         示例
            /The list of items follows:/r item_file
--------------------------------
s           [address1[,address2]]s/pattern/replacement/[flags]
             在每一个选定的行上用replacement代替pattern。假如用到模式地址,则模式//指的是指定的最后的模式地址。可以用任何定界符。用pattern或replacement内的\可转义定界符。可以指定下列的标记:
        g   在每个定位的行上代替所有的pattern的实例,而不只是第一个实例。
        p   假如成功地替代则输出该行,假如完成了多个成功的替代,则sed会输出该行的多个拷贝。
        w  file      假如做完了一次替代则将该行写到file中,最大限度可以打开10个不同的文件。
        n    在每个定位的行上代替pattern的第n个实例,n可以是1到512范围内的任意数,默认为1。
        示例:
           #Change third and fourth quote to ( and ) :
                 /function/{
                 s/"/(/3
                 s/"/)/4
                 }

                 #Remove all quote on a given line:
                  /Title/s/"//g

                 #Remove first colon and all quotes;print resulting lines:
                  s/://p
                  s/"//gp

                  #Change first "if" but leave "ifdef" alone:
                  /ifdef/!s/if/ if/
--------------------------------

论坛徽章:
0
5 [报告]
发表于 2005-10-18 17:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2005-10-18 17:29 |只看该作者

sed 命令

------------------------------
t             [address1[,address2]]t [label]
              假如成功地进行了替代则在定位的行上执行检测,如果是这样的话,则分支到由:label标记的行。假如没有指定label,则控制分支到加班的底部。t命令就如同c编程语言中的case语句一样。检测到每一种情况,当为真的时候退出该结构。
         示例
         假如想填充一个数据库中的空字段。如下:
            ID: 1 Name: greg Rate: 45
                  ID: 2 Name: dale
                  ID: 3
             想变成这样:
            ID: 1 Name: greg Rate: 45 Phone: ??
                  ID: 2 Name: dale Rate: ?? Phone: ??
                  ID: 3 Name: ???? Rate: ?? Phone: ??

             需要检测已经存在的字段数目。这里有一个脚本(字段用制表符分隔):
           #n
                 /ID/{
                 s/ID: .* Name: .* Rate: .*/& Phone: ??/p
                 t
                 s/ID: .* Name: .*/& Rate: ?? Phone: ??/p
                 t
                 s/ID: .*/& Name: ???? Rate: ?? Phone: ??/p
                 }
---------------------------------

论坛徽章:
0
7 [报告]
发表于 2005-10-18 17:55 |只看该作者

sed 命令

w       [address1[,address2]]w file
          追加模式空间的内容到file中,这个动作发生在遇到该命令时而不是模式空间被输出时。在w和file之间必须有空格。在一个脚本中最大限度可以有10个不同的文本被打开。假如文件不存在,这个命令会创建它;假如文件存在,在每次执行脚本时它的内容会被覆盖。将输出定向到同一个文件中的多个写命令会追加到文件尾。
      示例
         # Store tbl and eqn blocks in a file:
              /^\.TS/,/^\.TE/w troff_stuff
              /^\.EQ/,/^\.EN/w troff_stuff
------------------------------
x          [address1[,address2]]x
           交换模式空间和保持空间中的内容。参见h命令的示例
------------------------------
y          [address1[,address2]]y/abc/xyz/
            转换字符。改变a的每个实例为x,b为y,c为z等。
        示例:
         # Change item 1, 2, 3 to Item A, B, C ...
              /^item [1-9]/y/i123456789/IABCDEFGHI/
------------------------------

结束了,书上翻译很烂,大家慢慢理解吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP