【问题标题】:How to conditionally edit files in vim如何在vim中有条件地编辑文件
【发布时间】:2014-01-05 09:54:33
【问题描述】:

我需要根据内容使用 vim 批量编辑一堆文件。最简单的例子是,我想对文件执行一系列假设替换,但前提是文件的第一行与某个模式匹配。

我正在尝试做这种事情:

vim -e -s $file < changes.vim

我应该补充一点,我无法使用 sed 和 awk 等工具,并且想在 vim 中执行整个操作。

【问题讨论】:

  • 如果我是你,我会选择awk/sed
  • Kent 是对的,您想对这些文件进行哪些更改? sedawk 可能有更简单的方法。
  • 你能告诉我们changes.vim文件的内容吗?很可能这就是需要改变的地方,以便在不使用外部工具的情况下解决这个问题。
  • 我已经用vim-only 解决方案更新了我的答案。

标签: vim


【解决方案1】:

在 Vim 中,您可以通过:vimgrep 确定匹配的文件;要检查第一行中的匹配项,\%l 原子很方便:

:vimgrep /\%1lcertain pattern/ {file-glob}

然后,您可以使用:cfnext 遍历所有匹配项,或使用here 中的:QFDo 命令。

您可以通过vim -c {cmd} -c {cmd} ... 或在单独的脚本中传递这些命令,正如您在问题中概述的那样。

【讨论】:

  • 你能把它扩展成一个完整的解决方案吗?如果你这样做,我可能更喜欢它而不是我自己的......
【解决方案2】:

我建议您找到您需要的文件列表,并将该列表传递给您想要的命令。为此,awkxargs 的组合似乎很有用。您可能可以做一些更聪明的更短的事情……

awk 'FNR>1 {nextfile} /pattern/ { print FILENAME ; nextfile }' filePattern | xargs -I{} vim -e -s {} < changes.vim

在上面,filePattern 给出了你想要的所有文件(可能是*.c),/pattern/ 是你正在寻找的匹配的正则表达式。 xargs 将“一次输出一个”并将其替换为我放置 {} 的位置的以下命令。

我想向this link 提个醒,我在此找到了这个答案的灵感。

vim 唯一解决方案

编辑 - 在我发布后你说你需要一个“仅 vim”的解决方案。在这里……

第 1 步:创建一个 conditionalEdits.vim 文件,开头包含以下几行:

let line_num = search('searchExpression')  " any regex 
if line_num == 1                           " first line matched
  center                                   " put your editing commands here...
  update                                   " save changes
endif
quit

当然,您需要将所有编辑命令放在if 语句中,而不是仅仅将第一行居中。

现在,你执行这个命令

vim -c '/path/to/my/conditionalEdits.vim' -s filePattern

filePattern 与您可能感兴趣的所有文件匹配(但您在查看了里面的第 1 行之后肯定会知道......)

显然,您可以以通常的方式浏览文件并查找匹配/模式等内容,但这是基本的想法。

有用的链接:http://www.ibm.com/developerworks/library/l-vim-script-1/http://learnvimscriptthehardway.stevelosh.com

强烈建议您在单独的目录中执行此操作,首先使用少量文件的副本,以确保它确实按照您的想法执行。我不想为一堆被覆盖的文件负责(你确实备份了,对吗?)

【讨论】:

  • @Kent 我很确定——这可能是一个更好的解决方案。但这不是问题所在。我不知道changes.vim 中的内容是什么,所以我选择在尽可能接近最初意图的同时回答这个问题。
【解决方案3】:

你可以遍历所有文件,如果你找到了模式,打开 vim。一旦根据您的需要修改并关闭,下一个将打开。

#!/usr/bin/env bash

for file in *; do
    if [[ "$(sed '1q' ${file})" == "pattern" ]]; then
        vim ${file}
    fi
done

【讨论】:

  • 这个解决方案的优点是清晰而不是聪明。
  • 两个有效响应,但我的要求是在不使用 sed 和 awk 等工具的情况下执行此操作,并在 vim 中完成整个操作。
猜你喜欢
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多