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

原文本格式如下:
type1 aaa
a. 任意字符fefefel
b. 任意字符dfei2fe
c. 任意字符efefo3
type2 bbb
a. 任意字符dsfeiie
b. 任意字符eie3dfd8
c. 任意字符8239sdfe
type3 ccc
a. 任意字符feif3
b. 任意字符sefles
c. 任意字符eefwe55

希望替换为:
type1 aaa
a. type1 任意字符fefefel
b. type1 任意字符dfei2fe
c. type1 任意字符efefo3
type2 bbb
a. type2 任意字符dsfeiie
b. type2 任意字符eie3dfd8
c. type2 任意字符8239sdfe
type3 ccc
a. type3 任意字符feif3
b. type3 任意字符sefles
c. type3 任意字符eefwe55

请问在vim中可以实现吗?或者可以用其它软件或C语言实现吗?
补充一下:上面的aaa,bbb,ccc是文本内容,与序号a,b,c无关。

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的宏来处理,用脚本语言的“多行”属性,可以不必改动界面选项。


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

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-07-30
可以是可以,但要通常使用 vim 的脚本功能。 原始文件不上传,怎么帮你测试脚本? 文件格式不一定像你说的那么单纯,用正则跨行匹配会麻烦。
第2个回答  2014-07-28
sed -i '/^.\./!{
p
s/\([^[:blank:]]*\).*/\1/
h
d
}
/^.\./{
G
s/\(.\.\) \(.*\)\n\(.*\)/\1 \3 \2/
}'  文本文件名

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

追问

糟糕!我没表达清楚,我是用gvim,请问这些命令怎么输入?

追答

我没说在gvim中输入这些,在终端也就是linux shell输入这些命令

/^.\./!{
p
s/\([^[:blank:]]*\).*/\1/
h
d
}
/^.\./{
G
s/\(.\.\) \(.*\)\n\(.*\)/\1 \3 \2/
}

如果嫌在终端输入麻烦的话,将上面的代码保存为文件放在与文本文件同一个目录,文件名为sedscr

在终端切换到文件所在目录,输入命令

sed -f sedscr -i 文本文件名

追问

我是windows下的gvim,请问应该怎么输入啊?

第3个回答  2017-02-10
on assuming office as
相似回答