首页 理论教育 替换命令s,文件中的Linux替换为UNIX

替换命令s,文件中的Linux替换为UNIX

时间:2023-11-18 理论教育 版权反馈
【摘要】:前面提到过文件Linux.txt,把文件Linux.txt中的Linux换为UNIX:执行完上面的命令后,文件Linux.txt本身不受影响,如果要保留sed命令的输出,可以把输出重定向到某个文件。下面的echo命令中含有两个Linux,通过管道传给sed后,发现只有第一个Linux被替换为UNIX:实际上替换命令的完整格式是:s/regexp/replacement/flags。也就是,为什么最终“are many Linux books.”被替换为B,而不是“many Linux books.”等被替换为B?

替换命令s,文件中的Linux替换为UNIX

sed最常用的命令是s/regexp/replacement/。该命令的作用是,当某部分内容匹配了正则表达式regexp时,用replacement替换它。前面提到过文件Linux.txt,把文件Linux.txt中的Linux换为UNIX:

执行完上面的命令后,文件Linux.txt本身不受影响,如果要保留sed命令的输出,可以把输出重定向到某个文件。

如果一行有多个Linux,都能被替换为UNIX吗?下面的echo命令中含有两个Linux,通过管道传给sed后,发现只有第一个Linux被替换为UNIX:

实际上替换命令的完整格式是:s/regexp/replacement/flags。在命令的后面加上表示全局(global)的标志(也叫修饰符)g,可以保证一行中的每个匹配的字符串都得到替换:

也可以将g换为数字标志,1就是将第1个匹配替换,3就是将第3个匹配替换:

由于Linux系统对字母大小写敏感,下面的命令虽然使用了标志g,但只有最前面的Linux被替换为UBUNTU:

标志i的作用是忽略字母的大小写,即对大小写不敏感(insensitive):

修饰符g最常用。还有其他几个修饰符,这里不全部讲解。

下面把文件Linux.txt每行的前两个字符替换为一个字符A,^..表示行首任意两个字符:

把文件Linux.txt每行的前两个字符删除,即前两个字符被替换为空:(www.xing528.com)

把文件Linux.txt每行的第一个空格直至行尾的字符替换为字符B:

文件Linux.txt的最后一行没有空格,所以最后一行的内容还是Mike,没有变化。文件Linux.txt的前4行有空格,所以内容发生了变化。正则表达式“.*$”表示一个空格加任意多个字符直至行尾。以文件Linux.txt的第3行为例,字符串“are many Linux books.”“many Linux books.”“Linux books.”和“books.”都满足一个空格加任意多个字符直至行尾的模式要求。为什么正则表达式“.*$”匹配出“are many Linux books.”?也就是,为什么最终“are many Linux books.”被替换为B,而不是“many Linux books.”等被替换为B?答案是,正则匹配是“贪婪的”,在同等条件下,它总是尽可能匹配更多的字符。所以,“.*$”匹配了最长的“are many Linux books.”,而不是较短的“many Linux books.”,更不是最短的“books.”,以满足正则表达式的贪婪性。

假设有一个很长的脚本,其中有连续的100行需要注释掉,如果手工在每行的行首添加井号(#)会比较慢,用sed则可以一下子做完。例如,有一个文件comment_out.txt,为了容易看清,每行标明了行号,内容如下:

要把其中的第5到第7行注释掉,先指定行号范围,再替换(行首添加#号):

使用选项-r或--regexp-extended时,sed支持扩展正则表达式。例如,先将中间为#的一个字符串存入文件qq,然后先显示#后面的子字符串,再显示#前面的子字符串,中间为一个〈Tab〉键:

(.+)#(.+)为了匹配morning#afternoon,#就匹配#,.+代表一个或者多个字符,前面的.+匹配morning,后面的.+匹配afternoon;\1和\2分别代表第1个和第2个括号里面的匹配,即morning和afternoon,\t表示〈Tab〉键,则替换结果\2\t\1显示为afternoon[Tab键]morning。如果去掉上面命令中的选项-r,命令将运行失败。

如果希望将显示在屏幕上的sed的替换结果保存下来,除了使用输出重定向,还可以使用选项-i,将替换结果直接存入文件。接上面的例子,增加选项-i,将sed的运行结果存入文件qq:

如果希望保存替换结果的同时,能够备份输入文件,可在-i后面紧跟备份文件的后缀名,例如:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈