【发布时间】:2012-10-14 20:37:50
【问题描述】:
我正在尝试查找出现“MY_NAME”的完整源代码,并希望将其替换为“YOUR_NAME”。我已经知道它们出现的文件和行号,我想为它们制作一个补丁,以便任何运行补丁的人都可以做同样的事情。有人可以帮忙吗?
【问题讨论】:
-
您需要使用您对行号的了解吗?如果您让脚本查找 MY_NAME 并将其替换为 YOU_NAME ,那么该脚本编写起来会简单得多。
我正在尝试查找出现“MY_NAME”的完整源代码,并希望将其替换为“YOUR_NAME”。我已经知道它们出现的文件和行号,我想为它们制作一个补丁,以便任何运行补丁的人都可以做同样的事情。有人可以帮忙吗?
【问题讨论】:
您可以通过控制台进行操作。只需使用find 来定位目标文件,然后你就可以声明你想用什么句子替换什么。例如:
find -name '*' | xargs perl -pi -e 's/MY_NAME/YOUR_NAME/g'
【讨论】:
-name 如果您使用 '*' 的参数是不必要的/多余的 - 只需使用 find | xargs ... 代替。但是您可能想添加-type f,这样您就只查看文件而不是目录、符号链接、套接字等...
执行 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" '{}' \;
希望这会有所帮助 =)
【讨论】:
find 命令(或放置在 bash 脚本中)。该命令将搜索所有.c 和.h 文件并执行sed 脚本(假设它被称为script.sed)。如果文件中的行不同,您可以使用 SinnerShanky 的替换所有出现的建议(从命令中删除行号:s/MY_NAME/YOUR_NAME/g),或者如果所有文件都有在同一行范围内的行,您可以指定起始行,后跟逗号,然后是结束行:10,250s/MY_NAME/YOUR_NAME/g(第 10-250 行范围)。
使用命令 diff 创建一个补丁文件,然后可以通过补丁命令分发和应用。
man diff会给你提供很多流程信息。
【讨论】: