sed命令应用广泛,简单易用,是快速文本处理的利器。其实它并没有多少技巧。背诵和运用是最适合的学习渠道,是硬技能。但是它很复杂,因为高级功能太多了。本文不关注sed的高级功能,只讲解一些常用的操作。在使用过程中,你会发现它和vim的一些概念类似,正则表达式的语法也基本相同,学习成本也不高。从个人眼光和工作效率来看,sed命令是程序员必须掌握的重要工具。说现场会google的,多是习惯于将文本复制到excel中,慢慢磨练自己的技能,遇到大量文件就更加手忙脚乱了。不是一家不进一家,这篇文章不是为你写的。简单介绍如图。一个简单的sed命令由三个主要部分组成:参数、范围和操作。将要操作的文件直接挂在命令行末尾即可。除了命令行,sed还可以通过-f参数指定一个sed脚本。这是高级用法,不再赘述。我将多次重复一些示例命令。如果你聪明,你一定会找到规律,有时甚至不需要解释。参数-n该参数表示--quiet或--silent。表示忽略执行过程的输出,只输出我们的结果。还有一个我们常用的参数:-i。使用此参数后,所有更改都将在原始文件上执行。您的输出将覆盖原始文件。非常危险,必须引起注意。范围1,4表示查找文件中第1,2,3,4行的内容。这个range的规范很灵,请看下面的例子(图中range部分请自行替换)。5选择第5行。2,5选择2到5行,共4行。1~2选择奇数行。2~2选择偶数行。2,+3和2,5效果一样,一共4行。2、$从第二行到文件末尾。范围选择也可以使用正则匹配。请参见下面的示例。/sys/,+3选择带有单词sys的行和接下来的三行。/^sys/,/mem/选择以sys开头的行和以单词mem开头的行之间的数据。为了直观起见,下面的命令和上面的介绍一一对应,作用域和操作之间可以有空格。sed-n'5p'归档-n'2,5p'归档-n'1~2p'归档-n'2~2p'归档-n'2,+3p'归档-n'2,$p'filesed-n'/sys/,+3p'filesed-n'/^sys/,/mem/p'文件操作最常用的操作是p,意思是打印。例如下面两条命令是等价的:catfilesed-n'p'file除了打印,还有下面的操作,都是我们常用的。p打印匹配的内容。d删除匹配的内容。这时候应该去掉-n参数,想想为什么。w将匹配的内容写在别处。a、i、c等操作基本但很少用到,这里不做介绍。我们还是拿一些命令来说明。sed-n'2,5p'filesed'2,5d'filesed-n'2,5woutput.txt'file下面我们来看看sed命令能干什么,点开命令体验一下。删除所有以#开头的行和空行。sed-e's/#.*//'-e'/^$/d'文件是最常用的,比如下面的。sed-n'2p'/etc/group表示打印组文件中的第二行。1、参数部分,比如-n2,模式部分,比如'2p'3,文件,比如/etc/group,那么我想一次执行多条命令怎么办,但是我不想写sed脚本文件?然后你需要添加-e参数。sed的操作单位是行。上面的替换模式是sed命令常用的匹配模式,但它还有一个强大的替换模式,就是查找并替换部分值,并输出结果。-n参数很少与替换模式一起使用。替换模式的参数很多,但是第一部分和第五部分都可以省略。替换后,将输出整个文本。前半部分用于匹配一些范围,后半部分执行替换动作。Range这个范围类似于上面的范围语法。请参见下面的示例。/sys/,+3选择带有单词sys的行和接下来的三行。/^sys/,/mem/选择以sys开头的行和以单词mem开头的行之间的数据。具体命令为:sed'/sys/,+3s/a/b/g'filesed'/^sys/,/mem/s/a/b/g'filecommand这里的命令是指s。这就是替身的意思。查找匹配项查找部分查找要替换的字符串。这部分可以接受纯字符串或正则表达式。请参见下面的示例。a在范围行中查找字符串a。[a,b,c]从范围行中查找字符串a或b或c。命令类似:sed's/a/b/g'filesed's/[a,b,c]/<&>/g'file#这个命令下面有解释,是时候把找到的字符串替换上去.此部分的内容将替换在查找匹配部分中找到的内容。不幸的是,这部分不能使用正则表达式。常用的是精确替换。例如,将a替换为b。但也有高级功能。类似于java或者python的常规api,sed的替换也有MatchedPattern的意思,也可以得到Group,就不深究了。常用的替换字符是&。&号,再重复一遍。当它用在替换字符串中时,它表示原始搜索匹配数据。[&]表示将查找到的数据用[]包围起来。“&”表示查找的数据被“”包围。以下命令将用引号将文件中的每一行括起来。sed's/.*/"&"/'fileflag参数这些参数可以单独使用也可以多个使用,这里只介绍最常用的几个。默认情况下,g只匹配行中第一次出现的内容。添加g以替换整个文本。常用。p当使用-n参数时,p只会输出匹配的行内容。w类似于上面的w模式,但它只输出转换后的行。i参数比较重要,表示忽略大小写。e表示将输出的每一行都执行一个命令。不推荐使用xargs来完成这个功能。看两个命令的语法:sed-n's/a/b/gipwoutput.txt'filesed's/^/ls-la/e'fileisfun由于规律性,很多字符需要转义。您将在脚本中做很多\\、\*之类的操作。你可以使用|^@!替换\的四个字符。例如,以下五个命令是相同的。sed'/aaa/s/\/etc/\/usr/g'filed'/aaa/s@/etc@/usr@g'filed'/aaa/s^/etc^/usr^g'filed'/aaa/s|/etc|/usr|g'filesed'/aaa/s!/etc!/usr!g'文件注意:前半部分范围不能使用此方法。我习惯使用符号@。其他正则表达式如您所见,正则表达式在命令行中无处不在。下面,将给出简要描述。^行首$行尾。单个字符*0个或多个匹配项+1个或多个匹配项?0或1匹配{m}前一个匹配重复m次{m,n}前一个匹配重复m到n次**转义字符[0-9]匹配括号中的任意字符,或|的作用or,orb匹配一个词。例如,\blucky\b只匹配单词lucky。上面已经简单介绍了参数i。它的作用是让操作在原文件中执行。无论您做什么,原始文件都会被覆盖。这是非常危险的。通过添加参数,您可以对原始文件进行备份。sed-i.bak's/a/b/'file以上命令会对原文件生效,生成一个file.bak。强烈建议同时使用i参数指定bak文件。下面通过两个命令来看看sed和其他命令组合的威力吧。输出长度不少于50个字符的行sed-n'/^.{50}/p'统计每个单词在文件中出现的次数sed's//\n/g'file|排序|uniq-c查找目录下的py文件,删除所有行级注释find./-name"*.py"|xargssed-i.bak'/^[]*#/d'查看第5-7行和第10-13行sed-n-e'5,7p'-e'10,13p'file只输出ip地址iproute显示|sed-n'/src/p'|sed-e's/*//g'|cut-d''-f9End这篇文章配合《Linux生产环境上,最常用的一套“vim“技巧》一文,大家可以更好的查看,会发现很多类似的东西,这都离不开KISS原理。sed的另一个本质是x(Exchange)命令,但它也是一个高级功能。您可能在许多Makefile中看到过一些。sed甚至可以编写推箱子游戏。代码虽然爽,但是脑回路一点都不够。https://github.com/aureliojargas/sokoban.sed延伸阅读:《荒岛余生》forLinux(1)准备《荒岛余生》forLinux(2)《荒岛余生》forCPU(3)forLinux(4)I/O文章《荒岛余生》ofLinux(5)网络篇
