我有一个大文件,其中包含以下形式的多行:
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/