[TOC]sed命令整体可以做什么一般情况下,sed命令可以进行文本的查找、删除、插入、替换等操作。它与vim或vi命令最大的区别是后者只能通过手动交互来处理文本。而很多时候,我们希望脚本自动处理文本,那么sed无疑是我们的好帮手命令介绍sedOPTIONS[SCRIPT][INPUTFILE...]OPTIONS用于为处理后的文本指定一些输出行为,比如-i,-n,而SCRIPT定义的实际处理行为后面会详细解释,比如查询什么,删除什么,插入什么INPUTFILE这个就是具体要处理的文本。文本也可以来自管道符,所以命令格式如下:echo"WelcomeToTheGeekStuff"|sed's/\(\b[A-Z]\)/\(\1\)/g'示例文字描述为为了方便说明命令处理效果,首先我们准备一个文字sed_learn.txt,内容如下:unixisgreatos.unix是开源的。unix是免费的操作系统。学习操作系统。unixlinux你选哪个。find在脚本中,使用p作为搜索输出命令,表示print搜索指定行数的内容,并打印1到2行的文本。sed-n'1,2p'sed_learn.txt输出结果unixisgreatos.unix是开源的。unix是免费的os.learn操作系统。参数-n用于上面的搜索和打印,详细解释是找到指定关键字所在的行,并打印包含unix关键字的行sed-n'/unix/p'sed_learn.txt,输出结果如下:unixisgreatos.unix是开源的。unix是免费的操作系统。unixlinux你选哪个。在两个斜杠/unix/中间,除了指定关键字外,还可以指定正则表达式插入空行。使用G表示插入一个空行。每行后插入一个空行。sed'G'sed_learn.txt结果如下:unixisgreatos.unix是开源的。unix是免费的操作系统。学习操作系统。unixlinux你选哪个。在每行后面插入两个空行sed'G;G'sed_learn.txt结果如下unixisgreatos.unix是开源的。unixisfreeos.learnoperatingsystem.unixlinux你选哪一个。在指定位置插入内容,包含指定key在单词行后面插入一个新行:sed'/love/G'sed_learn.txt表示在包含love的行后插入一个新行,并在指定位置插入一个空格:sed's/^//'a.txt表示在所有行前插入5个空格,^表示删除开头的该行并在脚本中指定d命令表示通过删除文本来删除指定行。例如sed'1d'sed_learn.txt表示删除第一行,删除指定范围内的行。sed'1,2d'sed_learn.txt//表示删除1到2行sed'1,$d'sed_learn.txt//删除1到最后一行,删除最后一行sed'$d'sed_learn.txtSearchforthespecifiedpositionsed'/unix/d'sed_learn.txt//DeletealllinescontainingUnixlinesdeleteallblanklinessed'/^$/d'sed_learn.txtreplace替换命令的脚本格式一般为sedline_number1,line_number2's/search_keyword_or_regular_express/string_for_replace/search_range_for_one_line'search_keyword_or_regular_express指定一行中匹配的关键字或正则表达式表达式string_for_replace:指定匹配后要替换的字符。search_range_for_one_line:指定在一行中搜索匹配项的范围。默认只替换一行中第一次匹配的内容。line_number1、line_number2前面指定了特定行的匹配和替换行为。在这里,指定要匹配和替换的行。例如:sed'1,3s/unix/linux/'sed_learn.txt表示第1~3行第一个匹配的是unix,替换为linux。例如:sed'1,3s/unix/linux/g'sed_learn.txt表示将1到3行所有匹配unix的地方都替换为linux对文本进行编号,对所有行进行编号:sed=sed_learn。文本|sed'N;s/\n/\t/',其中等号=是为了在每行文本的前面插入一行带有数字的行。由于改变了换行符,换行符\n变成了管道符后面的制表符\t。当然我们可以直接用空格代替sed=sed_learn.txt|sed'N;s/\n//对非空行进行编号:sed'/./='a.txt|sed'/./N;s/\n//',通过/./来匹配所有非空行,然后使用=number。最后,将换行符\n替换为空格。在多命令模式下,可以指定多组命令,以分号分隔。例如sed'G'sed_learn.txt表示插入一个空行,sed'G;G'sed_learn.txt表示插入两个空行和一些选项参数就地修改-i。上面提到的所有查询、删除、替换都是直接将处理结果输出到终端。为了保留这些处理结果,我们可以使用重定向到某个文件保存,比如sed'/unix/d'sed_learn.txt>result.txt。但是我们也可以通过指定-i参数,直接将修改后的结果更新到原文件中,其中-i的意思是inplace,就是原地的意思,比如sed-i'1,$s/unix/linux/g'sed_learn.txt会直接将sed_learn.txt的内容更新为下面的linuxisgreatos。Linux是开源的。linux是免费的os.learnoperatingsystem.linuxlinux你选哪个。只输出匹配的文本-ndefault其他情况下,p命令会打印所有的文本,并重复打印匹配的文本。比如执行sed'1,2p'sed_learn.txt,结果如下,unixisgreatos。unix是开源的。unix是免费的操作系统。unix是伟大的操作系统。unix是开源的。unix是免费的os.learnoperatingsystem.learnoperatingsystem.unixlinux你选哪个。可以看出,它不仅输出了第三行的内容,还重复打印了1、2行。而-n只能打印匹配到的内容,不重复。基本上,sed命令就是先定位到某一行或者某一行的某个位置,然后进行相应的处理。此外,还需要指定具体要处理的行。参考资料https://www.geeksforgeeks.org...https://www.geeksforgeeks.org...欢迎关注我的个人公众号《西北偏北UP》,记录代码生活,行业思考,技术评论
