簡體   English   中英

如何刪除大括號內的代碼塊?

[英]How to delete block of code inside curly brackets?

我有一個包含一些代碼塊的文件:

dimensions{
   dim1{
      //foo
   }
   dim2{
      //bar
   }
}

如何刪除整個“尺寸”塊,包括里面的所有內容? 考慮到我不知道里面有多少塊,但我確定我們有相同數量的左大括號和右大括號? 提前致謝。

使用 vim 使用:global匹配包含dimensions的任何線都相當簡單:

:[range]g[lobal]/{pattern}/[cmd]

例如:

:g/dimensions/print

命令print將打印所有匹配的行:

將命令更改為normal! 可以在匹配的行上執行正常模式命令,例如d刪除或y ank。

:g/dimensions/normal! ...

命令d刪除,但需要跟隨它的動作,例如: $刪除直到換行符,或者在我們的例子中,我們可以使用%找到匹配的字符對, {匹配}(匹配)等。

:g/dimensions/normal! d%

可以從命令行調用 vim 並使用-c請求它執行命令:

vim -c 'g/dimensions/normal! d%' [inputfile]...

記得保存並關閉以避免 vim 保持打開狀態:

-c 'wq'

由於 vim 可以通過 vimrc 文件配置為需要的,因此可以從環境中禁用它:

-u NONE

全部一起:

vim -u NONE -c 'g/dimensions/normal! d%' -c 'wq' [inputfile]...

如果您可以使用 vim 而不是 sed,則可以利用非交互模式獲利:

vim input.txt -u NONE -c "call search('\\<dimensions{', 'w')" -c "norm maf{%d'a" -c "wq"

請注意,此版本將就地編輯文件。

這個方法很好,因為它會考慮到大括號塊的遞歸嵌套。

但是,這有一些問題:

  • 如果你有很多文件要處理,我想這會比使用 sed 慢;
  • norm命令不懂vim就不好理解

使用perl和遞歸正則表達式:

$ cat input.txt
some text before.
dimensions{
   dim1{
      //foo
   }
   dim2{
      //bar
   }
}
some text after.
$ perl -0777 -pe 's/dimensions(\{(?:(?>[^{}]+)|(?1))*\})\n//' input.txt
some text before.
some text after.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM