如何使用变量替换 vim 正则表达式

如何使用变量替换 vim 正则表达式

我有一个大文件,其中包含以下形式的多行:

USet07-1
USet07-2
USet08-1
USet08-2
.
.
.
USet22-2
.
.
.

我想-从 中的这些字符串中删除连字符/破折号vim。我用以下命令搜索字符串:

:/USet\d\d-\d

但是当我尝试用它们替换这些时

:%s/Uset\d\d-\d/USet\d\d\d

我显然明白了

USetddd

对于所有实例。但我想要的是:

USet071
USet072
USet081
USet082
.
.
.
USet222
.
.
.

如何才能做到这一点?我可以重用部分匹配字符串并将其用于替换吗?

答案1

是的,你可以,与捕获组。基本上,您可以使用以下内容包装模式的各个部分,\(...\)并使用以下内容在替换部分中引用该\1部分:

:%s/Uset\(\d\d\)-\(\d\)/USet\1\2

既然你只想消除模式的单个部分,较短的选项通过\zs(match start) 和\ze(match end) 限制实际匹配(但仍然断言周围的东西也在那里):

:%s/Uset\d\d\zs-\ze\d//

这些都是非常基本的事情,捕获组在许多基于正则表达式的工具(例如sed)中很常见。了解如何查找命令并导航内置:help;它很全面,并提供了许多技巧。您学习 Vim 的速度不会像其他编辑器那么快,但如果您致力于持续学习,它将证明它是一个非常强大且高效的编辑器。

答案2

感谢vim帮助,我自己使用子字符串匹配找到了一个解决方案:

:%s/\(USet\d\d\)-\(\d\)/\1\2/gc

答案3

Using sed command

sed "/^USet/s/-//" filename >outputfile

Suppose if you want to perform on orginal file

sed -i "/^USet/s/-//" filename

输出

USet071
USet072
USet081
USet082

awk 命令

awk '/^USe/{sub("-","",$0);print }' filename >outfile

output

USet071
USet072
USet081
USet082

答案4

\v如果使用模式前缀,正则表达式会更容易使用。这样,您就不必逃避({等等[

:%s/\vUSet(\d\d)-(\d)/USet\1\2/

相关内容