Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed与awk应用_Sed_Awk_Batch Processing - Fatal编程技术网

Sed与awk应用

Sed与awk应用,sed,awk,batch-processing,Sed,Awk,Batch Processing,我读了一些关于sed和awk的文章,了解到它们都是文本操纵器 我计划使用其中一个来编辑文件组(某些编程语言、js、python等中的代码),以便对大型文件集进行类似的更改。 现在主要是编辑函数定义(传递的参数)和变量名,但我能做的越多越好 我想知道是否有人尝试过类似的事情,以及那些尝试过类似事情的人,是否有任何明显的陷阱需要注意?sed和awk中的哪一种更适合此类应用。(或者完全是别的什么?) 输入 输出 function(ParamterOne){ //Some code here var P

我读了一些关于sed和awk的文章,了解到它们都是文本操纵器

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

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

输入

输出

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

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

移动目录:

替换文件中的文本:

Python正则表达式howto:

我还建议安装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);
下面是一个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;
}
但是想一想你的实际输入可能会有什么不同——符号之间的间距可能会有更多/更少/不同。你的作业可以从一行开始,到下一行结束。您可能会有一些注释,其中包含与您不希望更改的代码类似的行。一行中可以有多个语句。等等等等

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

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

  • 如果文件少于10000个,则手动更改文件,或者
  • 获取文件所用语言的解析器(例如编译器),并对其进行修改,以吐出更新的代码

  • 对于简单的文本处理,不需要使用成熟的编程/脚本语言(如perl或python)。简单地混合使用sed、awk和bash就足够了吗?“简单地混合使用sed、awk和bash”通常比脚本解决方案更复杂,更难维护。关键是有脚本语言的调试器,而shell脚本的调试难度众所周知。如果您尝试使用python或其他脚本语言进行类似的调试,请将其添加到您的答案中。Udo,我已经熟悉python中的正则表达式、目录遍历和替换,我所希望的是,向一个曾经尝试过像这样批量编辑代码文件的人学习。我经常这样做。我不明白的是:如果您熟悉这种技术,为什么需要一个代码示例?哪个更合适在很大程度上取决于您正在进行的文本操作
    awk
    对于某些任务会更好,而对于其他任务会更好。你最终可能会同时使用这两种方法。为什么不让我们看看你想做什么呢?包括一些输入和预期输出。你的问题很大程度上取决于你实际想做什么。是的,肯定有可能,但不是一项琐碎的任务,而且极端的情况会让你更加沮丧。花在阅读和工作上的时间将会得到很好的回报。Good luck.awk可以比任何其他脚本语言更简洁地做到这一点,但无论您选择何种脚本语言进行转换,为您的文件所用的语言编写解析器都将非常困难。与尝试编写工具相比,手动更改文件可能更快、更不容易出错。我在关于工具适用性的各种评论中看到一些混淆。sed是一个非常好的工具,可以对一行文本进行简单的更改。它还有许多不应该使用的其他语言结构。awk是一种简洁、功能齐全的工具/脚本语言,用于所有其他文本操作。bash是一种环境/脚本语言,用于从中调用工具并操作文件和进程。因此,如果您需要非常简单地操作多个文件中的文本,请在awk中简洁地编写文本处理,并在bash中简洁地编写文件查找/更新/调用awk。
    $ 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;
    }