我试图替换文本文件中由单引号包围的所有字符串,并以@开头,然后是任何数字,然后是任何其他字母(s)或#(s)的任何组合,如:
'package@1.1.k'
'otherpackage@14'
'anotherpackage@7.8'
和我希望只选择单引号,然后像这样删除它们:
export MYVAR="/dir/'package@1.1.k':$MYVAR"
:
export MYVAR="/dir/package@1.1.k:$MYVAR"
在整个文件中。我想出了一种方法,可以在两个单独的命令中删除前面的单引号和前面的单引号(使用vim的zs
和ze
,类似于正查找和负查找):
:%s/'.*@.[0-9]*.*zs'//g
:%s/zs'ze.*@.[0-9]*.*//g
然而,我对在一次操作中完成它很好奇,因为我想了解更多关于使用Neovim的知识,并将答案应用到未来的操作中。
我实际上使用的是Neovim,如果它附带任何与此相关的附加功能
你需要使用
%s/'([^@'0-9]*@[0-9][^']*)'/1/g
:
'
-单引号(
—抓包组启动[^@'0-9]*
- 0个或多个除@
,'
和数字以外的字符@
- a@
char[0-9]
-一个数字[^']*
- 0个或多个'
字符以外的字符
)'
-捕获组结束。
替代1
,第1组反向引用/占位符。
可以用捕获组1的内容替换以下正则表达式的匹配项。
'([^@']*@d[^@']*)'
演示我不熟悉Vim的正则表达式引擎,但我知道它是相当健壮的。考虑到我所建议的正则表达式没有什么花哨的(只是利用一个捕获组),我相信它应该在Vim中工作。
正则表达式可以分解如下:
' # match a single quote
( # begin capture group 1
[^@']* # match zero or more characters other than '@' and a single-quote
@d # match '@' followed by a digit ofollowed by zero or more characters
# other than '@' and a single-quote
[^@']* # match zero or more characters other than '@' and a single-quote
) # end capture group 1
' # match a single quote
我假设星号之间最多可以有一个"@",但如果允许多个(例如,如果要将'a@11@22*'
转换为a@11@22*
),则将正则表达式更改为
'([^']*@d[^']*)'