【问题标题】:Is there a way to make special edition (find and replace some strings) in files meeting some search criteria in VScode有没有办法在满足 VScode 中某些搜索条件的文件中制作特别版(查找和替换某些字符串)
【发布时间】:2020-01-05 08:47:57
【问题描述】:

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

请问有办法/功能吗?我在 Windows10 上安装了 VScode 1.37.1。我想要一些可以在 VScode 中运行的东西,在最坏的情况下,也许一些 linux 的东西可以提供帮助..

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

谢谢。

【问题讨论】:

  • 当您说“在所有包含字符串'-FI-'的文件中”时,您的意思是该字符串出现在文件name或文件contents中?
  • 我的意思是在文件内容中。
  • 在这种情况下,VSCode 本身无法做到这一点。你看过可用的extensions吗?另外,您是只对在 VSCode 中工作的解决方案感兴趣,还是可以使用命令行,完全独立于 VSCode?如果是这样,基于Cygwin 的解决方案是否可以接受,还是只能使用cmd.exe 或Powershell?
  • 我没有看到扩展,是的,Cygwin 可以提供帮助! ,我已经安装了它,但我不是 Linux 专家。

标签: visual-studio-code ide development-environment


【解决方案1】:

根据澄清的 cmets,我将问题解释为:

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

我会使用 Cygwin shell 命令而不是 VSCode 来解决这个问题。

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

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

分解:

  • grep 在文件中搜索文本。
  • -l 开关打印文件名而不是匹配行。
  • -r 开关在子目录中递归搜索。
  • -- 开关告诉grep 这是最后一个命令行选项,因此后续单词应被视为参数(即要搜索的文本)。这是必要的,因为我们的搜索文本以 - 开头,因此会被视为一个选项。
  • -Fl- 是要搜索的文本(区分大小写;使用 -i 选项进行不区分大小写的搜索)。
  • .grep 搜索的地方,意思是“当前目录”(加上所有文件和子目录,递归地,由于-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

一个可能的问题:如果任何文件名包含空格,那么这将不起作用,因为$(cat files.txt) 在将内容放入命令行之前会在空格边界处拆分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 将其输入添加到给定的命令行并运行它。
  • -d '\n' 告诉 xargs换行 边界处划分其输入,而不是任何空白。
  • -f 告诉 replace-across-files 以非交互方式进行所有替换。这是必要的,因为由于xargs 的工作方式,提示每次替换都不起作用。

【讨论】:

  • 谢谢你的回答,这正是我所需要的。
猜你喜欢
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2011-10-07
  • 2022-12-08
  • 2022-10-24
  • 2017-05-11
相关资源
最近更新 更多