vim - 从每行中的每个文件路径中提取文件名并添加到它旁边
问题描述
鉴于我在文件中的文本:
/home/dir1/file1.txt
/home/dir2/file2.txt
...
/home/dirn/filek.txt
我希望它是这个文本:
/home/dir1/file1.txt file1
/home/dir2/file2.txt file2
...
/home/dirn/filek.txt filek
我可以用vim写这个吗?
解决方案
此正则表达式有效:
:%s#.*/\(.*\)\.txt$#& \1#
开始.*/
会跳过所有内容,直到最后一个斜杠(它很贪婪,所以它会捕获所有目录部分。)
然后我们在一个组中捕获文件名\(.*\)
。
最后,我们将扩展匹配\.txt
并锚定到行尾。
对于替换,我们使用 a&
来保留完整路径,然后添加\1
以仅包含文件名。
我们可以#
用作分隔符,所以我们不需要转义/
s。我们这里只有一个,但是当涉及到路径时,这是一种有用的技术,所以我确保在这里使用它是为了保持一致性。
您可能想查看:help pattern-searches
以了解有关可用于搜索和替换的 Vim 正则表达式的更多信息。
(一般来说,Vim 文档很棒,如果您知道如何浏览它,帮助系统会非常有用,请参阅:help helphelp
更多信息。)
推荐阅读
- c# - WPF 图表中的自定义工具提示
- laravel-5 - 在 laravel 中使用 typeahead 进行 JQuery 自动完成搜索
- vue.js - 将 var 传递给 meta 中的 vue 路由器
- django - django celery AsyncResult AttributeError: 'DisabledBackend' 对象没有属性 '_get_task_meta_for'
- java - 无法在 Eclipse 中导出到存档文件“访问被拒绝”
- ansible - 稳定 | 错误!任务中未检测到任何操作。这通常表示模块名称拼写错误或模块路径不正确
- cytoscape.js - 方向感知邻里
- java - 如何在 Java 中处理一维数组的跳过输入
- arrays - For 循环中的 If 语句
- c# - 在 C# 中动态更改配置设置 kafka