3

我有几百个文件,它们都包含同一类“进程”的变体。我的意图是使每个类成为某个基类“BaseProcess”的派生类。每个文件都已手动重命名为“Process_XXX”之类的名称,我正在尝试找到一种方法来遍历每个文件并更改每次出现的情况,例如:

class Process {
    stuff;
}

class Process_XXX : public BaseProcess {
    stuff;
}

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

4

3 回答 3

2

我将添加一个考虑文件扩展名的答案(将我建议的更改添加到fedorqui的答案中)以及DVK答案的改进:

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#gwith XXXthebeing AlertGenerator。我正在使用这两者\(...\)来提取匹配项并在替换模式中使用它们作为\1\2back references在 中调用info sed)。

于 2013-07-23T10:35:42.143 回答
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;或者您可以根据需要重命名文件。

于 2013-07-22T13:13:50.713 回答
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。

于 2013-07-22T13:01:53.487 回答