2014-02-05 20 views
2

我的問題是關於一個非常具體的搜索和替換模式,但我希望找到更一般情況下的答案。我目前正在研究一些LaTeX幻燈片,其中有一些疊加層,我需要增加一個或多個整數。一個示例文本:vim中分隔符之間的數字遞增

\only<1,5-7,9>{hello 11} 

總之,只命令只顯示你好上幻燈片編號1,圖5至7和9在2位插入滑動經過11,我需要上述滑動所有幻燈片2增加。這是我想出了:

:.,$s/\d\+/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g 

從當前行到文件的末尾,它增加1 所有整數以上2這意味着,11也增加,這是不是我想:

\only<1,6-8,10>{hello 12} 

Q1:我怎麼能只匹配,並增加了分隔符 '<' 和 '>' 之間的整數?


最後,我想能夠細化搜索模式逐漸由指定模式和應用其他模式的結果。例如,我首先匹配給定示例文本中的分隔符之間的文本。

/<[^<>]*> 

這將突出我所引述的文字:

\only"<1,5-7,9>"{hello 11} 

並立即申請我原來的解決方案來增加分隔符之間的數字。我可以比較一下在管道符號的shell中將grep命令鏈接在一起,並使用每個新的grep命令改進結果。

Q2:這是鏈接的vim搜索模式可能嗎?


更新:弗洛里斯的解決方案非常接近。事實上,它解決了原來的問題,但我沒有提到所有要求。它們是:

- The delimiters are guaranteed to be on one line, e.g., <1,5-7,9>. 
- Multiple delimited parts can be on one line, e.g.: 
    hello 11\only<1,6-7,9>{hello 11}\only<1,6-7,9>{hello 11} 

第二個要求失敗,因爲該解決方案目前正在返回:

hello 12\only<1,7-8,10>{hello 12}\only<1,7-8,10>{hello 11} 

只的「>」中最後一次出現後忽略整數。我想要的結果是:

hello 11\only<1,7-8,10>{hello 11}\only<1,7-8,10>{hello 11} 

感謝您的任何幫助!

+0

你是真的試圖讓這種困難不是嗎?!...我認爲如果'<>'之間只有逗號,連字符和數字,我可以解決它,但是現在不能測試,並且會就像確認之前,我做了另一個「接近」的答案... – Floris

+0

我嘗試: )我想代替< and >之間的數字,你可以將它看作由字符[<>, - ]包圍的數字。 – gospes

回答

1

你基本上只需要在某些地方(即在<...>部分內)應用搜索和替換(帶有可以評估條件的表達式)。

這是困難的,因爲你要麼需要:

  • 仔細指定匹配條件與先行回顧後(如其他答案已經嘗試),或
  • 匹配的<...>,並執行另一個替代裏面,哪些Vim不允許(遞歸子替換表達式\=...)是不可能的)

新版本1。我PatternsOnText plugin 30可以處理這個問題:

首先,搜索<...>地點:

/<[^>]\+> 

然後,制定即只在搜索結果中應用特殊的替代:

:%SubstituteInSearch/\d\+/\=submatch(0) > 2 ? submatch(0) + 1 : submatch(0)/g 
0

如果可以假設\only<....將出現在一行它自己的,你可以簡單地

:.,$g/\\only<\d/s/\d\+/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g 

哪個,(:.,$g/\\only<\d/)用於目標線過濾:global命令,然後你的「魔「subsitution不變:)

+0

我認爲問題在於替換繼續在'hello'之後的數字。你需要一個'lookaround'表達式(「數字在'<' and '>之間'),我不知道,Vim的正則表達式支持它 – Floris

+0

@Floris啊......我希望後,顯示的預期結果...:{? – sehe

+0

那會是合理的;但他_did_說:「這意味着,11也增加,這是不是我想要的」 – Floris

2

你需要一個lookahead結構 - 我認爲它如下:

:.,$s/[0-9]\+\(.*>\)\@=/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g 

我說的事情是

\(.*>\)\@= 

這是一個「積極的期待」,零寬度斷言說

在此之前的事情必須跟任意數量的字符,隨後的關閉括號

你可以在vim help或https://stackoverflow.com/a/18391881/1967396(這是我從中得到的)中找到更多關於語法的信息。

運行上面,我沒有得到

\only<1,6-8,10>{hello 11} 

爲輸出 - 這是我想你想要的。

注:我在Mac上測試了這個vim。據瞭解,它的行爲與linux版本略有不同(好吧,我從sed的差異推斷出來,我實際上並不知道知道vim也不一樣了......)。如果這不起作用,它應該快樂結束。

+0

這確實非常接近有它雖然失敗了,情況是我不好,是因爲。我沒有在我的問題中提到它,雖然分隔符位於同一行,但可以有多個分隔符,我將更新我的問題。 – gospes

相關問題