題 在Vim中如何刪除與模式不匹配的所有單詞和字符


這些年來我用Google搜索了好幾次,並沒有找到一個好的解決方案,所以我放棄了並且要求。

我希望能夠刪除與模式不匹配的所有單詞和標點符號。

所以說我有這個清單

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1

我想刪除一切但是bwrb。* 471,[0-9]所以我離開了

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1

有一個簡單的VIM命令可以完成嗎?

謝謝。


4
2018-03-01 20:03


起源




答案:


:%s/\v(.*)(bwrb.*471,\d)(.*)/\2

做你想要的樣品。如果你的現實世界需求更複雜,它可能需要改變。

基本上,模式匹配整條線,但我們使用分組將我們想要的東西與我們不想要的東西分開。我們得到三組,“在我們想要之前”,“我們想要什麼”,“在我們想要的之後”,我們用第二組替換整條線,注意到 \1

一步步:

  • %s/

    替換是在整個文件上完成的。

  • \v

    “非常神奇”的標誌可用於限制反斜杠的數量並提高易讀性。

  • (.*)

    第一組包含任意數量的任何字符。錨定到行的開頭是隱含的,因此它匹配任何東西 之前 你想要什麼。這將是 \(.*\) 沒有“非常神奇”的旗幟。

  • (bwrb.*471,\d)

    這是第二組:你的模式。我唯一改變的是 [0-9] 我用等效的替換,但更短 \d

  • (.*)

    第三組包含任意數量的任何字符,直到行尾。

  • /\2

    替換部分僅包含在第二組中。


11
2018-03-01 20:45



你可以在答案中添加一些關於這個命令構造的信息嗎? - dinesh
@dinesh,看我的編輯。 - romainl
謝謝,這正是我需要的,因為有些實例項目在模式之後。 - 7null
@romainl感謝您添加...非常有用 - dinesh
+ 1和我一生的感激,向我介紹“非常神奇”的旗幟。 - Scribblemacher


我用這個命令:

%s/.*\(BWRB.*471,[0-9]\).*/\1

%:將命令應用於所有文件行。

s/pattern/replacement/:替換命令使用 sed

  • .* 匹配任何字符,直到子字符串匹配 \(BWRB.*471,[0-9]\) 找到了。子字符串後面的任何字符都匹配 .*。括號指示 vi 保存子字符串。

  • 更換 \1 打印以前保存的子字符串,實際上從行中刪除了任何不需要的字符。

例如,這個文件(稍微修改了你的例子):

R61,1,BWRBW0471,2
R14,1,BWRBW0471,5
R162,1,BWRBN0471,0
R61 ,1,BWRBN0471,4
R61 ,1,BWRBN0471,1
R61 ,1,BWRBN0766471,1

轉換為:

BWRBW0471,2
BWRBW0471,5
BWRBN0471,0
BWRBN0471,4
BWRBN0471,1
BWRBN0766471,1

2
2018-03-01 20:30



謝謝,這也有效,但只有在模式之後沒有任何內容。我猜我不會總是知道。 - 7null
我明白了,我已經修改了我的答案,將其考慮在內。 - jaume


我不確定在你的琴弦之前有多少可變性,但聽起來你只想要一個簡單的“在每一行上替換BWRB”。

:%S /.* \ zeBWRB //克


1
2018-03-01 20:39