2012-07-27 76 views
1

(^這裏M爲^ V^M,FF = UNIX)Vim的比賽多^ M開頭的東西就行了(FF = UNIX)

s/^M*$/\^M/工作正常,轉換0許多^ M成一個^ M在任何一行上。

但試圖做到這一點只匹配線路,如「匹配文字在這裏與越來越多的文字^ M^M^M」與s/^matchtext.*\zs^M*$/\^M/,它不起作用,而是它增加了一個^ M?

這是我不明白的.*的行爲, s/\zs^M*$/\^M/作品,但只是介紹s/.*\zs^M*$/\^M/沒有。

魔法/ nomagic問題? s/.\\*\zs^M*$/\^M/似乎工作,但再次s/matchtext.\\*\zs^M*$/^M/不。

+3

你的問題我不清楚。你想達到什麼目的?當我有'sometext。^ M^M^M'並且我做':s/sometext。\ zs^M * $/\^M /'時,它用一個'^ M'替代三個'^ M'' 。這不是你想要的嗎? – Conner 2012-07-27 16:16:51

+0

原來是一種特殊情況,嘗試將文本改爲'sometext和越來越多的文本^ M^M^M'和's/sometext。* \ zs^M * $/\^M /'並且它不起作用。 – kilves76 2012-07-27 16:23:57

回答

3

.*是匹配的一切,包括所有尾隨^M S的離開沒有你的^M*匹配的,因爲它是一個*所以匹配0情況下是允許它匹配什麼。第一個*的貪婪主宰了第二個*的貪婪。

要解決它,你可以使第一*非貪婪(:help non-greedy),但我認爲你應該只使用:g命令,就像這樣:

:g/^matchtext/s/^M*$/\^M/ 
+1

不錯的做法。把'.'改成'[^^ M]'也可以:'s/^ matchtext [^^ M] * \ zs^M * $/\^M /',但我更喜歡你的解決方案。 – Johnsyweb 2012-07-27 22:51:41

+0

編輯我的答案,添加我第一次忘記的反斜槓。 @Johnsyweb,'[^^ M]'方法略有不同:它會在一行中間的一個'^ M'處停下來,這會被其他人忽略。 – 2012-07-27 23:27:57

+0

謝謝你的回答Alan,在你的幫助下,我找到了正確的非貪婪形式'/^matchtext。\ { - } \ zs^M * $/\^^ M /'這是有效的。 Johnsyweb,這是一個非常合理的解決方案,謝謝你。 – kilves76 2012-07-28 01:54:05