Linux管理员 - sed命令



sed是一个复杂的实用程序,需要掌握。此命令流式传输编辑器以过滤和转换文本。已经编写了整本书专门用于熟练地使用sed。因此请记住,本教程的目的是介绍sed的三个基本常用用法:

  • 字符替换
  • 打印操作
  • 删除操作

sed的常用命令语法为:

sed [options] [file to operate on]

以下是需要记住的常用sed开关。

开关 动作
-i 就地编辑文件而不是流,-i[SUFFIX]创建备份文件
-e 添加要执行的脚本命令
-n 静默,抑制自动打印
-r ReGex,在脚本中使用扩展正则表达式

-i将把更改应用于文件,而不是像传递到sed一样编辑文件的流。

sed在与-e选项一起使用时,扩展了命令以对流处理多个操作。这可以代替递归地管道化sed来完成。

echo "Windows and IIS run the Internet" | sed -e 's/Windows/Linux/' -e 's/ and           
IIS//'  -e 's/run/runs/' 
Linux runs the Internet

sed-n选项会抑制默认打印到标准输出。如我们所见,使用sed的打印命令,每一行都将被复制到标准输出。

bash-3.2# sed 'p' ./lines.txt  
line1 
line1 
line2 
line2

这次,我们使用sed-n选项:

bash-3.2# sed -n 'p' ./lines.txt  
line1 
line2

sed会将内容流发送到标准输出。当添加'p'或打印命令时,会为每一行发送一个单独的流,导致所有行在标准输出中被复制。

sed替换命令

此命令使用's'选项指定。我们已经多次看到sed与其替换命令一起使用。以下是一个简单的示例:

[root@centosLocal Documents]# echo "developers eat veggies and fruit" | sed -e
's/veggies/pizza/' -e 's/fruit/coffee/' 
developers eat pizza and coffee 
[root@centosLocal Documents]#

让我们在一个名为dev.txt的文件上试试这个:

[root@centosLocal centos]# cat dev.txt  
Developers code all night and sleep all day.
[root@centosLocal centos]#

现在,让我们更改文件的内容,而不仅仅是发送到sed的输出流:

[root@centosLocal centos]# sed -ibak 's/sleep/code/' ./dev.txt  
[root@centosLocal centos]# ls dev* 
dev.txt  dev.txtbak 
[root@centosLocal centos]# cat dev* 
Developers code all night and code all day. 
Developers code all night and sleep all day. 
[root@centosLocal centos]#

注意 - 我们使用-i选项和一个唯一的后缀来创建备份文件。

sed打印命令

此命令使用'p'命令指定。

让我们使用我们的names.txt文件,输出为了简洁起见已进行编辑:

[root@centosLocal Documents]# sed -n "p" ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305

sed允许使用“地址”更细致地定义打印到标准输出的内容:

[root@centosLocal Documents]# sed -n "1,10p" ./names.txt
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
[root@centosLocal Documents]#

就像head一样,我们打印了names.txt文件的前10行。

如果我们只想打印出那些在9楼有办公室的人呢?

[root@centosLocal Documents]# sed -n "/90/p" ./names.txt 
Marian:Little:903 
Dale:Barton:901 
Kellie:Curtis:903: 
Gina:Carr:902 
Antonia:Lucas:901 
[root@centosLocal Documents]#

很简单。我们还可以打印出所有人,除了那些在9楼有办公室的人:

[root@centosLocal Documents]# sed -n '/90/ !p' ./names.txt 
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
Billy:Crawford:301 
Rosa:Summers:405 
Matt:Davis:305 
Francisco:Gilbert:101
Sidney:Mac:100 
Heidi:Simmons:204 
Matt:Davis:205 
Cristina:Torres:206 
Sonya:Weaver:403 
Donald:Evans:403

在上面的代码中,我们用!否定了/和/之间的'p'打印操作。这与“d”或删除命令类似。但是,否定在sed中的结果可能会有所不同。因此,作为一个通用的规则:p用于打印并否定您不想要的内容。

sed删除命令

如前所述,删除命令与sed打印命令相反。让我们从我们的name.txt文件开始:

[root@centosLocal Documents]# sed 'd' ./names.txt  
[root@centosLocal Documents]#

没有打印任何内容。在上面的命令中,我们要求sed从流中的标准输出中删除每一行。现在,让我们只打印前两行并“删除”其余的流:

[root@centosLocal Documents]# sed '1,2 !d' ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608
[root@centosLocal Documents]#

看到了吧?类似于'p'或打印命令。现在让我们用删除命令做一些有用的事情。假设我们要删除文件中所有空行:

[root@centosLocal Documents]# cat lines.txt  
line1 
line2 
line3 
line4 
line5 
[root@centosLocal Documents]#

从复制和粘贴电子邮件或使用非标准换行符格式化时,收到包含杂乱文本的此类文件并不罕见。我们无需在vim中交互式编辑文件,而是可以使用sed为我们完成这项工作。

[root@centosLocal Documents]# sed -i '/^\s*$/ d' ./lines.txt
[root@centosLocal Documents]# cat ./lines.txt  
line1 
line2 
line3 
line4 
line5 
[root@centosLocal Documents]#

该文件现在以易于阅读的方式格式化。

注意 - 在对重要文件进行更改时,请使用-i开关。强烈建议附加文件备份后缀以保留文件内容(sed可能会因最轻微的错误而进行一些极端的更改)。

basic_centos_linux_commands.htm
广告