有没有办法在 VScode 中满足某些搜索条件的文件中制作特别版(查找并替换一些字符串)

Is there a way to make special edition (find and replace some strings) in files meeting some search criteria in VScode

我几乎不是visual studio代码的高级用户。 我无法找到制作特别版的方法(例如:将字符串 'ABC' 更改为文本 'TEXT1 TEXT2'),仅在已经满足我想要的搜索条件的文件中。 我需要的使用示例:在所有包含字符串 '-FI-' 的文件中,将字符串 'ABC' 替换为字符串 'TEXT1 TEXT2'.

请问有 way/feature 吗?我在 Windows10 上安装了 VScode 1.37.1。我想要 运行 在 VScode 中的东西,在最坏的情况下,一些 linux 东西可能会有所帮助..

我已经进行了搜索,但没有找到任何帮助。例如,我尝试了如何在搜索和编辑中进行搜索。而且我没有足够的知识来使用正则表达式。

谢谢。

根据澄清意见,我将问题解释为:

  • 如何在还包含字符串“-Fl-”的文件中将所有 "ABC" 实例替换为 "TEXT1 TEXT2",从给定目录开始并递归地考虑其下的所有文件?

我会使用 Cygwin shell 命令而不是 VSCode.

来解决这个问题

首先,让我们创建一个文件,其中包含所有包含字符串“-Fl-”的文件的名称。在bashshell处,使用cd进入感兴趣的目录,然后运行:

  $ grep -l -r -- '-Fl-' . > files.txt

分解:

  • grep 在文件中搜索文本。
  • -l 开关打印文件名而不是匹配行。
  • -r 开关在子目录中递归搜索。
  • --开关告诉grep那是最后一个命令行选项,所以后面的词应该被视为参数(即要搜索的文本)。这是必要的,因为我们的搜索文本以 - 开头,否则将被视为一个选项。
  • -Fl- 是要搜索的文本(区分大小写;使用 -i 选项进行不区分大小写的搜索)。
  • .grep查找的地方,意思是"current directory"(加上所有文件和子目录,递归,由于-r)。
  • > files.txt 部分表示将结果写入 files.txt

在继续之前,在编辑器中打开 files.txt 或只是 cat 到终端以验证它对您来说是否合理:

  $ cat files.txt

现在我们需要在此文件列表中进行搜索和替换。仅使用常用的 shell 命令并不容易,因此我编写了自己的脚本来执行此操作:

将其另存为名为 "replace-across-files" 的文件。我通常将此类内容放入 $HOME/scripts,也称为 ~/scripts,因此我假设您已完成相同的操作(如有必要,请先创建该目录)。

现在,回到有files.txt和运行的目录:

  perl ~/scripts/replace-across-files 'ABC' 'TEXT1 TEXT2' $(cat files.txt)

这将以交互方式提示您每次出现。使用 y(或直接回车)分别接受每个文件,Y 接受当前文件中的所有文件,使用 ! 进行所有替换。

如果得到perl: command not found,则需要先安装Cygwin perl

一个可能的陷阱:如果任何文件名包含 space,那么这将不起作用,因为 $(cat files.txt) 在白色 space 边界处拆分 files.txt将内容放到命令行上。解决这个问题的一种方法是使用 xargs 代替:

  $ cat files.txt | xargs -d '\n' perl ~/scripts/replace-across-files -f 'ABC' 'TEXT1 TEXT2'

分解:

  • cat files.txt |files.txt 的内容作为输入提供给下一个命令 xargs
  • xargs 将其输入添加到给定的命令行并 运行s 它。
  • -d '\n' 告诉 xargsnewline 边界处划分其输入,而不是任何白色 space.
  • -f 告诉 replace-across-files 以非交互方式进行所有替换。这是必要的,因为根据 xargs 的工作方式,提示每次替换将不起作用。