【问题标题】:Replace a part of statement with another in whole source code在整个源代码中用另一个语句替换部分语句
【发布时间】:2012-10-14 20:37:50
【问题描述】:

我正在尝试查找出现“MY_NAME”的完整源代码,并希望将其替换为“YOUR_NAME”。我已经知道它们出现的文件和行号,我想为它们制作一个补丁,以便任何运行补丁的人都可以做同样的事情。有人可以帮忙吗?

【问题讨论】:

  • 您需要使用您对行号的了解吗?如果您让脚本查找 MY_NAME 并将其替换为 YOU_NAME ,那么该脚本编写起来会简单得多。

标签: linux vim sed


【解决方案1】:

您可以通过控制台进行操作。只需使用find 来定位目标文件,然后你就可以声明你想用什么句子替换什么。例如:

find -name '*' | xargs perl -pi -e 's/MY_NAME/YOUR_NAME/g'

【讨论】:

  • -name 如果您使用 '*' 的参数是不必要的/多余的 - 只需使用 find | xargs ... 代替。但是您可能想添加-type f,这样您就只查看文件而不是目录、符号链接、套接字等...
【解决方案2】:

执行 sed 命令然后生成补丁可能更容易。

sed -e '12s/MY_NAME/YOUR_NAME/g;32s/MY_NAME/YOUR_NAME/g' file > file2

这将在第 12 行和第 32 行将 MY_NAME 替换为 YOUR_NAME,并将输出保存到 file2。

如果改动较多,也可以生成sed脚本:

#!/bin/sed -f

12s/MY_NAME/YOUR_NAME/g
32s/MY_NAME/YOUR_NAME/g

那么,对于很多文件,你应该使用find

find -type f '(' -iname "*.c" -or -iname "*.h" ')' -exec "./script.sed" '{}' \;

希望这会有所帮助 =)

【讨论】:

  • 如果他想替换文件中所有出现的地方,只需避免指定行号。
  • 我想在所有被触摸的文件中添加什么?因为整个源代码有很多文件..脚本只适用于一个文件,对吗?
  • @JanitoVaqueiroFerreiraFilho:所以我一开始就将这个查找行添加到我的脚本中?此外,所有文件都没有在相同的行号处出现这些情况。一些文件有 15-20 次出现,并且大多数文件都出现在不同的行号。那我该如何进行呢? :)
  • 您可以在 shell 中执行find 命令(或放置在 bash 脚本中)。该命令将搜索所有.c.h 文件并执行sed 脚本(假设它被称为script.sed)。如果文件中的行不同,您可以使用 SinnerShanky 的替换所有出现的建议(从命令中删除行号:s/MY_NAME/YOUR_NAME/g),或者如果所有文件都有在同一行范围内的行,您可以指定起始行,后跟逗号,然后是结束行:10,250s/MY_NAME/YOUR_NAME/g(第 10-250 行范围)。
  • 好吧,酷。现在还有一件事。如果我想在所有这些文件的开头添加一行代码怎么办?
【解决方案3】:

使用命令 diff 创建一个补丁文件,然后可以通过补丁命令分发和应用。

man diff会给你提供很多流程信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多