请教一个vim中的正则替换问题:把查找到的内容替换为前面最近行的指定内容。

发布网友 发布时间:2022-04-24 11:56

我来回答

4个回答

热心网友 时间:2023-10-11 22:56

vim我不了解,正则替换应该都差不多。

如果情况确实如你提供的这么简单:
^(.+? )(.+\na\. )(.+\nb\. )(.+\nc\. )
替换为:
\1\2\1\3\1\4\1

▲注意4个)前都有一个空格。

我在EmEditor中试的。
其他编辑器,可能换行符\n会有区别,比如针对 Windows换行格式(CrLf) 要写成\r\n。
你试试,不行再追问讨论。追问谢谢!我也用emeditor。问题解决了,是我的emeditor版本实在太低了。

追答

我看到了你之前的追问:(很抱歉没空及时答复)

上面a.、b.、c.各行之间还有多个无关行需要删除,请问如何匹配这些无关行?我用(^.+\n){1,9}这样的格式想匹配1到9行,但是不行啊,是不是{1,9}这种表达方式不对啊?


很高兴你已解决。

追问不答也是浪费,希望对别人还有点用:


EmEditor 界面搜索 的“匹配多行”要开启相关设置项(如图):

▲如需帮助,可再联系。


表达式可以用:

^([\s\S]*?\n){1,9}

^(.*?\n){1,9}

▲注意要用?约束。

▲我用*而不是+,把 一个空行 作为 一行 处理。


也可用EmEditor的宏来处理,用脚本语言的“多行”属性,可以不必改动界面选项。


开启“匹配多行”可能带来一定风险,慎用。

热心网友 时间:2023-10-11 22:56

可以是可以,但要通常使用 vim 的脚本功能。 原始文件不上传,怎么帮你测试脚本? 文件格式不一定像你说的那么单纯,用正则跨行匹配会麻烦。

热心网友 时间:2023-10-11 22:57

sed -i '/^.\./!{
p
s/\([^[:blank:]]*\).*/\1/
h
d
}
/^.\./{
G
s/\(.\.\) \(.*\)\n\(.*\)/\1 \3 \2/
}'  文本文件名

用VIM应该是LINUX系统吧,将上面的命令原样复制到命令行,文本文件名用实际的文件名替代

热心网友 时间:2023-10-11 22:57

on assuming office as

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com