[关闭]
@cdmonkey 2017-04-21T03:56:43.000000Z 字数 3681 阅读 901

sed

命令总结


一、简介

该指令工具是非交互式的“流式编辑器”。它可以对文本流(可以是一个文本文件或者是通过管道送来的文本内容)进行修改、转换或过滤。Sed命令不会修改源文件,除非使用Shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

工作原理:“逐行”处理文件(或输入),并将结果发送到屏幕。具体过程如下:

  1. #对通过管道发送过来的文本流进行转换操作。
  2. [root@MySQL-01 ~]# echo "front" | sed 's/front/back/'
  3. back

该示例中,首先利用echo生成了一个单词的文本流,然后将该文本流交给sed指令进行处理,而sed则对文本流执行替换指令,最后输出“back”作为运行结果。总的来说,首先给定sed某个编辑命令(在命令文本行中)或是包含多个命令的脚本文件名,然后sed便对文本流的内容执行给定的编辑命令。

注意:sed中的操作命令总是以单个字母开头。

注意:需要记住的一个事实是,无论命令是什么,sed并不与原始文件打交道,它操作的只是一个副本,然后所有的改动如果没有重定向到一个文件中,则仅会将结果输出到屏幕。

因为是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行,所以在运行sed命令之前,需要先“定址”(即选定要处理的文本范围)。定址用于决定对哪些行进行编辑,地址的形式可以是数字、正则表达式、或者二者的结合。如果没有指定地址,将默认处理输入文件中的所有行。

定址如果是一个数字,则表示行号。是“$”符号,则表示最后一行。例如:

  1. #只打印文件的第三行(如果不加p命令,则将提示错误):
  2. sed -n '3p' oldboy.txt

上述示例中,如果没有添加“-n”选项,则指定文件的所有行都会打印到屏幕上,并将第三行打印两行。要想得到正确的结果,就必须添加该选项,以防止sed指令会默认输出所有的内容。

只显示指定行范围的文件内容,例如:

  1. #查看文件的第100-200行内容:
  2. sed -n '100,200p' oldboy.txt

要注意的是,后面接的动作,请务必以两个单引号('...')括住!

地址如果是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式或者二者的组合表示。例如:

  1. sed '2,5d' oldboy.txt #删除第二到第五行
  2. sed '/My/,/You/d' oldboy.txt #删除包含"My"的行到包含"You"的行之间的行
  3. sed '/My/,10d' oldboy.txt #删除包含"My"的行到第十行的内容

如果在指令中进行明确的定址,则在地址字符串后要紧跟(无空格)命令动作符。

例如将“/etc/passwd”的内容输出并且打印行号,同时请将第2~5行删除:

  1. [root@moban ~]# nl /etc/passwd | sed '2,5d'
  2. 1 root:x:0:0:root:/root:/bin/bash
  3. 6 sync:x:5:0:sync:/sbin:/bin/sync
  4. 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  5. ...

上例中如果要删除第三行到最后一行的内容,则:

  1. [root@moban ~]# nl /etc/passwd | sed '3,$d'
  2. 1 root:x:0:0:root:/root:/bin/bash
  3. 2 bin:x:1:1:bin:/bin:/sbin/nologin

地址表示法:

此处输入图片的描述

动作:

此处输入图片的描述

常用选项:

选项 长选项 说明
-e__ --expression 进行多项编辑,即对输入行应用多条sed命令时使用。
-n --quiet\silent 使用安静(silent)模式(取消默认的输出)。默认情况下,所有来自标准输入的数据都会被打印输出到屏幕上。但如果加上“-n”选项后则只有经过特殊处理的那一行才会被打印出来。
-f --file 指定sed脚本的文件名。直接将sed的动作写在一个文件内,-f filename则可以运行指定文件内的动作。
-i --in-place 直接修改读取的源文件内容,而不是输出到终端。
-r --regexp-extended 支持使用扩展的正则表达式。
-s --separate 将每个文件看做单独的,而不是将所有文件看做一个长的文本流。

二、动作

Action p

用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项“-n”用于取消默认的打印操作。当该选项和命令p同时出现时,可打印选定的内容。

  1. [root@Server-A ~]# sed '/my/p' oldboy.txt
  2. #默认情况下,会把所有输入行都打印出来。而如果某行匹配模式,p命令将把该行另外打印一遍。
  3. [root@Server-A ~]# sed -n '/my/p' oldboy.txt
  4. #取消默认输出,p命令把匹配模式的行打印一遍(只显示匹配行)。

上述示例中用的是以斜杠隔开的正则表达式“/my/”,查找包含指定字符串的文本行。

  1. #通过以行为单位的显示功能,就能够将某一个文件内的某些行号选择出来显示:
  2. [root@Server-A ~]# nl oldboy.txt | sed -n '2,5p'

再次注意:如果是用了“-n”选项,则基本上要使用p动作,否则什么也不会显示。

  1. #其实该动作很适合用于数据的搜寻并显示:
  2. [root@Server-A ~]# sed -n '/teacher/,/computer/p' oldboy.txt
  3. My teacher is oldboy
  4. This is a test!
  5. My computer is Thinkpad E431
  6. -------------------
  7. #从第一行打印到匹配指定字符串的那一行:
  8. [root@Server-A ~]# sed -n '1,/computer/p' oldboy.txt

Action d

用于删除输入行。sed先将输入行从文件复制到模式空间里,然后对该行执行sed命令,最后将模式空间里的内容显示在屏幕上。如果发出的是命令d,当前模式空间里的输入行会被删除,不被显示。

  1. [root@Server-A ~]# sed '$d' oldboy.txt #删除最后一行,其余的都被显示。
  2. [root@Server-A ~]# sed '/my/d' oldboy.txt #删除匹配的行,其余的都被显示。

这个动作可用于数据的搜寻并删除!

Action s

除了整行的处理模式之外,sed还可以以行为单位进行部分数据的搜寻并取代。基本上它的搜寻与替代的与vi相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'         其中的『g』表示全局替换,如果将其去掉,则只替换第一处。
  1. sed 's/^My/You/g' oldboy.txt
  2. #命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个匹配,所有的都被替换。
  3. sed -n '1,20s/My$/You/gp' oldboy.txt
  4. #取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的匹配进行替换,并打印到屏幕上。
  5. -------------------
  6. sed 's#My#Your#g' oldboy.txt
  7. #紧跟在s动作后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟在动作符后面,就成了新的串分隔符。

该动作也可以搭配grep命令用来删除一行当中的某个字符串:

  1. [root@moban ~]# cat oldboy.txt
  2. I am oldboy,my qq is 31333741
  3. My teacher is oldboy
  4. ...
  5. [root@moban ~]# cat oldboy.txt|grep 'teacher'|sed 's/oldboy//g'
  6. My teacher is #原内容被删除了,即用来替换的字符串为空。

下面的示例只替换每一行的第一个s:

  1. [root@moban ~]# sed 's/s/S/1' my.txt #其中的数字表示替换第几处。
  2. ThiS is my cat, my cat's name is betty
  3. ThiS is my dog, my dog's name is frank
  4. ThiS is my fish, my fish's name is george

我们可以使用“&”符号来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:

  1. [root@moban ~]# sed 's/my/[&]/g' my.txt #使用符号『&』表示前面要被替换的那个字符串。
  2. This is [my] cat, [my] cat's name is betty
  3. This is [my] dog, [my] dog's name is frank
  4. This is [my] fish, [my] fish's name is george

三、选项

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注