Vim的替换操作

描述

Vim是从vi发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。作为一个风靡世界、粉丝众多的文本编辑器,Vim有着极为丰富的操作命令。本题便是要求你编写一个程序,模拟Vim编辑器的替换命令。
Vim替换命令的格式一般为(方括号中的内容为可选项,花括号中的内容为必选项):
:[range]s/{pattern}/{string}/[flag]
其中:冒号':'是这一类命令的开始;[range]表示命令的作用域,即命令起作用的行的范围;s是替换命令substitute的简写;{pattern}和{string}分别为待搜索的模式串和所要替换成的替换串;'/'用来界定{pattern}和{string}的起始;[flag]表示标志位,用来开启或关闭一些选项。
行范围[range]通常是两个整数,表示作用域起始行和结束行的行号,中间以一个逗号隔开。如:"4,8"表示第4行到第8行(包括第4行和第8行)。文本的行号从1开始。也可以用一个百分号'%'表示文档的所有行。(除此之外,Vim还提供了更多灵活的表示方式。如某个数省略不写则代表光标所在行,"$"代表文本的最后一行等等,这样",$"就表示光标所在的行到最后一行。)
{pattern}和{string}都支持正则表达式(如果你不知道什么是正则表达式,比赛结束记得google一下~)。如果{pattern}为空串,则使用上一条替换命令中的 {pattern}作为模式串。
显然,{pattern}和{string}中不能包含分隔符,否则会产生歧义。为此,要使用反斜杠'\'进行转义。例如,要将全文中的"<br>"替换为"<br />",就不能写成
:%s/<br>/<br />/g
而必须写成:
:%s/<br>/<br \/>/g
如果这两个表达式中的斜杠非常多,比如"file:///usr/share/man/man1/vim.1.gz",那么对每个斜杠进行转义就显得很麻烦。为此人们想到了一个解决办法,就是可以使用其他字符作为分隔符(总是将作为替换命令代表的's'后的第一个字符作为分隔符)。例如使用'+'做分隔符时,上述命令就可以写成这样:
:%s+<br>+<br />+g
[flag]有多种,"g"表示替换[range]范围内每行中的所有匹配模式,而不写"g"时,只对每行第一次匹配出现的{pattern}进行替换。例如对于文本
#include <stdio.h>
执行命令
:%s/i//g
得到的结果是
#nclude <stdo.h>
而执行命令
:%s/i//
得到的结果是
#nclude <stdio.h>
其他的选项还有:"c"表示每次替换前要求确认,"i"表示不区分大小写,等等。这里就有一个问题,如果要把"a"替换成"aa",那么会怎么样呢。大家可能担心它会死循环(变出无限长的"a"串),但实际上却没有,因为替换有个原则就是:在一轮替换中,产生的字符不能作为被替换的对象。所以如果要把"a"替换成"aa",实际的效果就是所有的连续"a"串长度都翻了倍。
为了简化问题,这里我们做一些约定:
1.    [range]必须出现,仅以"%"或"a,b"的形式出现,a、b为整数,且a不大于b。
2.    {模式串}和{替换串}都仅由英文字母、数字、空格及下划线组成(不包括下述所有可选的分隔符,因此不需要转义)。
3.    可选的分隔符为"/~!@#$%^&*()-+="之一。
4.    [flag]选项总是"g"。

下面给出一个综合性的例子。
例如,原文本为:
If the Tao is greet, then the operating system is greet.
If the operating system is greeter, then the compiler is greet.
If the compiler is greeter, then the applications is greet.
The user is pleased and there is harmony in the world.
使用命令:
:[1,4]s/greet/great/g
或:
:%s+greet+great+g
都将把文本更正为:
If the Tao is great, then the operating system is great.
If the operating system is greater, then the compiler is great.
If the compiler is greater, then the applications is great.
The user is pleased and there is harmony in the world.
请你实现这个简化了的VIM替换命令。

输入

只有一组输入数据。其中第一行包含一个正整数L(L <= 100),表示待处理文本的行数。接下来的L行为待处理文本的内容,每行不超过100个字符。
之后每行有一个替换命令,命令的总数不超过50个,并保证在所有替换命令的执行过程中每行都不超过100个字符。

输出

每个替换命令执行之后,依行号从小到大的顺序,输出所有发生了替换的行的行号和内容,每个文本行对应一行输出。其中行号宽度为4个字符,向右对齐,不足部分以空格补齐。行号结束后输出两个空格,接着为替换后的文本行内容。
如果某条命令没有进行任何替换,输出一行"Pattern not found"(不包括引号)。
每个替换命令的结果输出完毕后再加一个换行。

样例输入
4
If the Tao is greet, then the operating system is greet.
If the operating system is greeter, then the compiler is greet.
If the compiler is greeter, then the applications is greet.
The user is pleased and there is harmony in the world.
:1,3s/greet/great/g
:%s//great/g
样例输出
   1  If the Tao is great, then the operating system is great.
   2  If the operating system is greater, then the compiler is great.
   3  If the compiler is greater, then the applications is great.

Pattern not found
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值