0

sed と awk について少し読んだことがありますが、どちらもテキスト マニピュレーターであることを理解しています。

これらの 1 つを使用してファイルのグループ (プログラミング言語、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 行で開始し、次の行で終了することができます。変更したくないコードに似た行を含むコメントが含まれている可能性があります。1 行に複数のステートメントを含めることができます。などなど

一度にすべての問題に対処できますが、ファイルを更新するよりもはるかに時間がかかる可能性があり、それでも完全に正しく解決できない可能性があります.

あなたのコードが非常によく構造化されていて、特定の非常に制限的なコーディング形式に厳密に従っている場合、スクリプト言語でやりたいことを実行できるかもしれませんが、最善の策は次のいずれかです。

  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 に答える