我的文件文本如下:
java-environment-common (3-1)
jdk8-openjdk (8.u172-2)
libart-lgpl (2.3.21-4)
expect (5.45.4-1)
dejagnu (1.6.1-1)
cython2 (0.28.4-1)
python2-pytz (2018.5-1)
python2-sip (4.19.8-1)
我想删除括号(包括括号)中的所有文本。
我使用%s/\(.*\)//g
,但它删除了每一行。
最后,我得到了正确的答案:%s/\s\(.*\)//g
!但是为什么正则表达式的结果如此不同,所以第二个只是删除一个空格。
请告诉我原因,谢谢!
答案 0 :(得分:2)
在非非常魔术模式下,\(...\)
创建一个捕获组,您实际上并未将文字(
和)
与{{1} }和\(
。
您必须在找
\)
运行此命令后,我得到以下输出:
%s/\s*(.*)//g
要仅删除0+空格和该行末尾的以下java-environment-common
jdk8-openjdk
libart-lgpl
expect
dejagnu
cython2
python2-pytz
python2-sip
子字符串,请使用
(...)
哪里
%s/\s*([^()]*)$//g
-超过0个空格\s*
-文字(
(在非常魔术模式下)(
-除[^()]*
和(
以外的0多个字符)
-文字)
(在非常魔术模式下))
-行尾。答案 1 :(得分:2)
您不小心通过将转义斜杠\
放在方括号之前来创建捕获组。对于vim来说,这意味着应该保存所有放在这些括号中的正则表达式,以便我们在替换时再次使用这些值。实际上,它根本不是在寻找括号!您在%s/\s\(.*\)//g
中的实际操作是找到一个\s
的空格,后跟任意数量的任何字符,保存这些字符供以后使用,然后将发现的所有内容全部替换为空(不使用您之前保存的值)。碰巧也会删除您的方括号及其内容,但并非出于您认为如此的原因。
如果您要搜索方括号,删除方括号并删除其中的所有内容,正确的方法是不逃避方括号,如下所示:
:%s/\s(.*)$//g
在这里,我告诉vim找到一个空格,然后是一个开括号,然后是任意数量的任何字符,然后是一个右括号,然后是一个换行符(换行符),然后告诉它将所有内容替换为空(指示由//
)
答案 2 :(得分:1)
另一个命令
:%norm f(D
% ...... the whole file
f( ..... jump to the next (
D ...... erases till the end of line
使用t(
代替f(
,我们也可以删除空格
答案 3 :(得分:1)
您可以使用:
:%s/\s(.*)//g
答案 4 :(得分:0)
您还可以使用:normal command
(更多信息在这里http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching)
在特定情况下,可以使用以下方法:
:normal /(/di
命令说明:寻找(
,然后di
将在()范围内删除。