我有几百个文件都包含同一类的变体'Process'。我的目的是使每个类成为某个基类'BaseProcess'的派生类。 每个文件都被手动重命名为'Process_XXX'之类的东西,我试图找到一种方法来浏览每个文件并更改每次出现的内容,例如:
class Process {
stuff;
}
到
class Process_XXX : public BaseProcess {
stuff;
}
其中XXX取自正在更改的特定文件。这可能使用Bash或Perl脚本吗?或者最好手动进行? 干杯 千斤顶
答案 0 :(得分:2)
我会在考虑文件扩展名的情况下添加答案(将我建议的更改添加到answer fedorqui)以及DVK's answer的改进:
for SUFFIX in cc h java txt; do
for file in *.$ext; do
sed -i.bak "s#^\\(\\s*class\\s\\+Process\\)\\(\\s*{\\)#\\1_${file/%.$SUFFIX} : public BaseProcess\2#g" $file
done
done
模式的一个示例是s#^\(\s*class\s\+Process\)\(\s*{\)#\1_AlertGenerator : public BaseProcess\2#g
,XXX
为AlertGenerator
。我正在使用两个\(...\)
来提取匹配项,并在替换模式中将其用作\1
和\2
(在back references
中称为info sed
)。< / p>
答案 1 :(得分:1)
如果文件位于同一个目录中并且具有相同的模式名称,例如file
,则可以使其成为:
for file in file*
do
sed -i.bk "s/Process/Process_$file : public BaseProcess/g" $file
done
请注意,使用-i.bk
时,系统会创建一个备份文件$file.bk
。
使用三个文件成功测试:file1,file2,file3。
答案 2 :(得分:1)
perl -pi.bak -e \
's#^\s*class Process {#class Process : public BaseProcess_$ARGV {#g;' \
Process_XXX
mv *.bak /your/backup/directory
这类似于SED的解决方案(Perl的部分根源是sed :),但好处是如果需要更复杂的任务,它可以轻松扩展。例如。如果您的文件位于各种子目录中,则可以使用Perl的File::Find
;或者你可以根据需要重命名文件。