为了账号安全,请及时绑定邮箱和手机立即绑定

请问使用vi的替换命令或shell能完成此需求吗,给点提示也行,谢谢!!!

请问使用vi的替换命令或shell能完成此需求吗,给点提示也行,谢谢!!!

临摹微笑 2023-05-02 19:15:54
需求如下: 输入文件input.txt:a1a2a3a4b1b2a5b3b4b5 要求输出文件output.txt为:a1a4b1b2a5b3b5 即去掉第N行,N满足的条件是:第N行与第N-1、第N+1行的首字母都相同(不去掉首行与末行)。
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

vim的正则

%s/\v((.).*\n)((\2.*\n)+)(\2.*$)/\1\5/g

分成三段解释一下

((.).*\n)
匹配第一行,外层分组用于替换的时候反向引用,内层分组用于后面判断 

((\2.*\n)+) 
匹配接下来 以上一行第一个字母开头的行(1行或多行)

(\2.*$)  
匹配一行以第一行第一个字母开头的行

最后 \1\5 把上面匹配到的所有的行 替换成第一行和最后一行,即删除中间的行

注:最开始的\v是切换到perl正则模式,这样括号、加号就不需要转义了

BTW 这种文本处理的工作用perl脚本完成是最方便的,vi的好处是可视化调试,但是遇到大文件就GG了


查看完整回答
反对 回复 2023-05-05
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信