使用Bash / Perl根据每个文件的名称修改文件

时间:2013-07-22 12:57:50

标签: string perl bash oop substitution

我有几百个文件都包含同一类的变体'Process'。我的目的是使每个类成为某个基类'BaseProcess'的派生类。 每个文件都被手动重命名为'Process_XXX'之类的东西,我试图找到一种方法来浏览每个文件并更改每次出现的内容,例如:

class Process {
    stuff;
}

class Process_XXX : public BaseProcess {
    stuff;
}

其中XXX取自正在更改的特定文件。这可能使用Bash或Perl脚本吗?或者最好手动进行? 干杯 千斤顶

3 个答案:

答案 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#gXXXAlertGenerator。我正在使用两个\(...\)来提取匹配项,并在替换模式中将其用作\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;或者你可以根据需要重命名文件。