0

我已经阅读了一些关于 sed 和 awk 的内容,并且了解它们都是文本操纵器。

我计划使用其中一个来编辑文件组(某些编程语言、js、python 等的代码),以对大型文件集进行类似的更改。现在主要是编辑函数定义(传递的参数)和变量名,但我可以做得越多越好。

我想知道是否有人尝试过类似的事情,以及那些尝试过的人,是否有任何明显的陷阱需要注意?以及 sed 和 awk 中的哪一个更适合/更适合这种应用程序。(或者也许完全是别的东西?)

输入

function(paramOne){
//Some code here
var variableOne = new ObjectType;
array[1] = "Some String";
instanceObj = new Something.something;
}

输出

function(ParamterOne){
//Some code here
var PartOfSomething.variableOne = new ObjectType;
sArray[1] = "Some String";
var instanceObj = new Something.something
}
4

2 回答 2

2

这是一个 GNU awk(用于“gensub()”函数)脚本,它将您的示例输入文件转换为您想要的输出文件:

$ cat tst.awk
BEGIN{ sym = "[[:alnum:]_]+" }
{
   $0 = gensub("^(" sym ")[(](" sym ")[)](.*)","\\1(ParameterOne)\\3","")
   $0 = gensub("^(var )(" sym ")(.*)","\\1PartOfSomething.\\2\\3","")
   $0 = gensub("^a(rray.*)","sA\\1","")
   $0 = gensub("^(" sym " =.*)","var \\1","")

   print
}

$ cat file
function(paramOne){
//Some code here
var variableOne = new ObjectType;
array[1] = "Some String";
instanceObj = new Something.something;
}

$ gawk -f tst.awk file
function(ParameterOne){
//Some code here
var PartOfSomething.variableOne = new ObjectType;
sArray[1] = "Some String";
var instanceObj = new Something.something;
}

但是请考虑一下您的实际输入可能会如何变化 - 您可以在符号之间有更多/更少/不同的间距。您可以从一行开始分配,然后在下一行完成。您的注释可能包含与您不想更改的代码相似的行。您可以在一行上有多个语句。等等等等

您可以一次解决每个问题,但这可能比仅更新文件要花更长的时间,而且您可能仍然无法完全正确。

如果您的代码结构非常好并且严格遵循特定的、高度限制性的编码格式,那么您可能可以使用脚本语言做您想做的事情,但您最好的选择是:

  1. 如果文件少于 10,000 个,则手动更改文件,或者
  2. 获取用于编写文件的语言的解析器(例如编译器)并对其进行修改以吐出更新的代码。
于 2013-02-25T13:29:09.563 回答
0

一旦它开始变得稍微复杂一点,您无论如何都会切换到脚本语言。那么为什么不首先从 python 开始呢?

遍历目录: 在python中遍历和处理目录中的文件

替换文件中的文本: 用 Python 替换文件中的文本

Python 正则表达式方法:http: //docs.python.org/dev/howto/regex.html

我还建议安装 Eclipse + PyDev,因为这将使调试更容易。

这是一个简单的自动替换器的示例

import os;
import sys;
import re; 
import itertools;

folder = r"C:\Workspaces\Test\";
skip_extensions = ['.gif', '.png', '.jpg', '.mp4', ''];
substitutions = [("Test.Alpha.", "test.alpha."), 
                 ("Test.Beta.", "test.beta."),
                 ("Test.Gamma.", "test.gamma.")];

for root, dirs, files in os.walk(folder):
    for name in files:
        (base, ext) = os.path.splitext(name);
        file_path = os.path.join(root, name);
        if ext in skip_extensions: 
            print "skipping", file_path;
        else:
            print "processing", file_path;

            with open(file_path) as f:
                s = f.read();

            before = [[s[found.start()-5:found.end()+5] for found in re.finditer(old, s)] for old, new in substitutions];
            for old, new in substitutions:
                s = s.replace(old, new);
            after = [[s[found.start()-5:found.end()+5] for found in re.finditer(new, s)] for old, new in substitutions];

            for b, a in zip(itertools.chain(*before), itertools.chain(*after)):
                print b, "-->", a;

            with open(file_path, "w") as f:
                f.write(s);
于 2013-02-23T22:25:22.300 回答