@cdmonkey
2017-04-21T11:56:43.000000Z
字数 3681
阅读 965
命令总结
该指令工具是非交互式的“流式编辑器”。它可以对文本流(可以是一个文本文件或者是通过管道送来的文本内容)进行修改、转换或过滤。Sed命令不会修改源文件,除非使用Shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
工作原理:“逐行”处理文件(或输入),并将结果发送到屏幕。具体过程如下:
#对通过管道发送过来的文本流进行转换操作。
[root@MySQL-01 ~]# echo "front" | sed 's/front/back/'
back
该示例中,首先利用echo生成了一个单词的文本流,然后将该文本流交给sed指令进行处理,而sed则对文本流执行替换指令,最后输出“back”作为运行结果。总的来说,首先给定sed某个编辑命令(在命令文本行中)或是包含多个命令的脚本文件名,然后sed便对文本流的内容执行给定的编辑命令。
注意:sed中的操作命令总是以单个字母开头。
注意:需要记住的一个事实是,无论命令是什么,sed并不与原始文件打交道,它操作的只是一个副本,然后所有的改动如果没有重定向到一个文件中,则仅会将结果输出到屏幕。
因为是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行,所以在运行sed命令之前,需要先“定址”(即选定要处理的文本范围)。定址用于决定对哪些行进行编辑,地址的形式可以是数字、正则表达式、或者二者的结合。如果没有指定地址,将默认处理输入文件中的所有行。
定址如果是一个数字,则表示行号。是“$”符号,则表示最后一行。例如:
#只打印文件的第三行(如果不加p命令,则将提示错误):
sed -n '3p' oldboy.txt
上述示例中,如果没有添加“-n”选项,则指定文件的所有行都会打印到屏幕上,并将第三行打印两行。要想得到正确的结果,就必须添加该选项,以防止sed指令会默认输出所有的内容。
只显示指定行范围的文件内容,例如:
#查看文件的第100-200行内容:
sed -n '100,200p' oldboy.txt
要注意的是,后面接的动作,请务必以两个单引号('...')括住!
地址如果是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式或者二者的组合表示。例如:
sed '2,5d' oldboy.txt #删除第二到第五行
sed '/My/,/You/d' oldboy.txt #删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' oldboy.txt #删除包含"My"的行到第十行的内容
如果在指令中进行明确的定址,则在地址字符串后要紧跟(无空格)命令动作符。
例如将“/etc/passwd”的内容输出并且打印行号,同时请将第2~5行删除:
[root@moban ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
上例中如果要删除第三行到最后一行的内容,则:
[root@moban ~]# nl /etc/passwd | sed '3,$d'
1 root:x:0:0:root:/root:/bin/bash
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 |
将每个文件看做单独的,而不是将所有文件看做一个长的文本流。 |
用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项“-n”用于取消默认的打印操作。当该选项和命令p同时出现时,可打印选定的内容。
[root@Server-A ~]# sed '/my/p' oldboy.txt
#默认情况下,会把所有输入行都打印出来。而如果某行匹配模式,p命令将把该行另外打印一遍。
[root@Server-A ~]# sed -n '/my/p' oldboy.txt
#取消默认输出,p命令把匹配模式的行打印一遍(只显示匹配行)。
上述示例中用的是以斜杠隔开的正则表达式“/my/”,查找包含指定字符串的文本行。
#通过以行为单位的显示功能,就能够将某一个文件内的某些行号选择出来显示:
[root@Server-A ~]# nl oldboy.txt | sed -n '2,5p'
再次注意:如果是用了“-n”选项,则基本上要使用p动作,否则什么也不会显示。
#其实该动作很适合用于数据的搜寻并显示:
[root@Server-A ~]# sed -n '/teacher/,/computer/p' oldboy.txt
My teacher is oldboy
This is a test!
My computer is Thinkpad E431
-------------------
#从第一行打印到匹配指定字符串的那一行:
[root@Server-A ~]# sed -n '1,/computer/p' oldboy.txt
用于删除输入行。sed先将输入行从文件复制到模式空间里,然后对该行执行sed命令,最后将模式空间里的内容显示在屏幕上。如果发出的是命令d,当前模式空间里的输入行会被删除,不被显示。
[root@Server-A ~]# sed '$d' oldboy.txt #删除最后一行,其余的都被显示。
[root@Server-A ~]# sed '/my/d' oldboy.txt #删除匹配的行,其余的都被显示。
这个动作可用于数据的搜寻并删除!
除了整行的处理模式之外,sed还可以以行为单位进行部分数据的搜寻并取代。基本上它的搜寻与替代的与vi相当的类似!他有点像这样:
sed 's/要被取代的字串/新的字串/g' 其中的『g』表示全局替换,如果将其去掉,则只替换第一处。
sed 's/^My/You/g' oldboy.txt
#命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个匹配,所有的都被替换。
sed -n '1,20s/My$/You/gp' oldboy.txt
#取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的匹配进行替换,并打印到屏幕上。
-------------------
sed 's#My#Your#g' oldboy.txt
#紧跟在s动作后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟在动作符后面,就成了新的串分隔符。
该动作也可以搭配grep命令用来删除一行当中的某个字符串:
[root@moban ~]# cat oldboy.txt
I am oldboy,my qq is 31333741
My teacher is oldboy
...
[root@moban ~]# cat oldboy.txt|grep 'teacher'|sed 's/oldboy//g'
My teacher is #原内容被删除了,即用来替换的字符串为空。
下面的示例只替换每一行的第一个s:
[root@moban ~]# sed 's/s/S/1' my.txt #其中的数字表示替换第几处。
ThiS is my cat, my cat's name is betty
ThiS is my dog, my dog's name is frank
ThiS is my fish, my fish's name is george
我们可以使用“&”符号来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:
[root@moban ~]# sed 's/my/[&]/g' my.txt #使用符号『&』表示前面要被替换的那个字符串。
This is [my] cat, [my] cat's name is betty
This is [my] dog, [my] dog's name is frank
This is [my] fish, [my] fish's name is george