3

任意であることがわかっているが、標準設定では縮小されないプロパティを細かく縮小できれば、一部の JS プロダクション コードのサイズを効果的に縮小できます。つまり、高度な縮小設定が問題すぎる場合は、縮小と同じように「a」のような単一の文字に置き換えます。プロジェクトの一部として、置き換え可能な既知の文字列のコンマ区切りリストを含むテキスト ファイルを維持できます。

csvからファイルごとに手動でも、これを達成できるバットまたはシェルスクリプトを持っている人はいますか? または、同じことを達成するための別の提案はありますか? 私はWindowsを使用しているので、とにかく、shスクリプトはGit bashで動作する必要があります:)

検索/置換の側面と同様に、一意であるができるだけ短い置換文字列を生成する必要があります。

4

3 に答える 3

2

OK、必要最小限の JavaScript/HTML ソリューションをJSFiddleに投稿しました。これは、フィドルにある HTML と CSS を含まない JavaScript コードです。

rndCh = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
rndLen = rndCh.length;

// Generate random string from number
function genRand(index) {
    var ni = [], rv = "";
    while (index > 0) {
        ni.push(index % 62);
        index = ~~(index / 62);
    }
    if (!ni.length) {
        ni.push(0);
    }
    while (ni.length > 0) {
        rv += rndCh[ni.pop()];
    }
    return rv;
}

$(document).ready(function() {
    $("#gobutton").on("click", function(e) {
        var prefix, code, rlist, ir, nrep, nrval;

        prefix = $("#myprefix").val();
        if (!prefix) {
            alert("Need prefix");
            return;
        }
        code = $("#mycode").val();
        if (!code) {
            alert("Need code");
            return;
        }
        rlist = $("#mylist").val();
        if (!rlist || !rlist.length) {
            alert("Need replacement list");
            return;
        }
        rlist = rlist.split(",");

        for (ir = 0;  ir < rlist.length;  ++ir) {
            if (rlist[ir]) {
                // Generate next random
                nrval = prefix + genRand(ir);
                nrep = new RegExp(rlist[ir], "g");
                code = code.replace(nrep, nrval);
            }
        }

        $("#myoutput").val(code);
    });
});
于 2012-09-12T18:28:32.200 に答える
2

JavaScript を使いたくない人のための C++ バージョンがあります。標準の C++ ライブラリのみを使用します。

#include <stdio.h>
#include <io.h>
#include <string.h>

#include <vector>
#include <string>

void Usage(const char* msg = NULL)
{
    if (msg)
        printf("%s\n", msg);
    printf("Usage: coderep (prefix) (infile) (listfile) (outfile)\n");
}

char* OpenAndReadFile(const char* filename)
{
    FILE* fp = fopen(filename, "rb");
    if (!fp)
        return NULL;
    fseek(fp, 0, SEEK_END);
    int size = (int)ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* buf = new char[size + 2];
    fread(buf, 1, size, fp);
    buf[size] = '\0';
    fclose(fp);
    return buf;
}

void ReplaceAll(std::string& str, const std::string& from, const std::string& to)
{
    size_t start_pos = 0;
    while ((start_pos = str.find(from, start_pos)) != std::string::npos)
    {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length();
    }
}

char* rndCh = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int rndLen = 62;

// Generate random string from number
void genRand(int index, std::string* str)
{
    std::vector<int> ni;
    while (index > 0)
    {
        ni.push_back(index % 62);
        index = index / 62;
    }
    if (!ni.size())
        ni.push_back(0);

    std::vector<int>::reverse_iterator ip;
    for (ip = ni.rbegin();  ip != ni.rend();  ++ip)
        (*str) += rndCh[*ip];
}

int main(int argc, char* argv[])
{
    if (argc != 5)
    {
        Usage();
        return 1;
    }

    // Read inputs and check parms
    const char* prefix = argv[1];
    char* code = OpenAndReadFile(argv[2]);
    if (!code || !*code)
    {
        Usage("Failed reading code");
        return 1;
    }
    char* list = OpenAndReadFile(argv[3]);
    if (!list || !*list)
    {
        delete[] code;
        Usage("Failed reading list");
        return 1;
    }
    const char* outfile = argv[4];
    if (!outfile || !*outfile)
    {
        Usage("Need output file");
        return 1;
    }

    // Split list
    std::string scode(code);
    std::vector<std::string> vlist;
    std::string acc;
    const char* lp = list;
    while (*lp)
    {
        if (*lp == L',')
        {
            vlist.push_back(acc);
            acc.clear();
        }
        else
        {
            acc += *lp;
        }
        ++lp;
    }
    if (acc.size() > 0)
        vlist.push_back(acc);

    // Do translation
    int index = 0;
    std::string rstr;
    std::vector<std::string>::iterator ilist;
    for (ilist = vlist.begin();  ilist != vlist.end();  ++ilist)
    {
        rstr = prefix;
        genRand(index, &rstr);
        ++index;

        ReplaceAll(scode, *ilist, rstr);
    }

    // Write results
    FILE* outp = fopen(outfile, "wb");
    if (!outp)
    {
        Usage("Error creating output file");
        return 1;
    }
    fwrite(scode.c_str(), sizeof(char), scode.size(), outp);
    fclose(outp);

    return 0;
}
于 2012-09-12T23:00:45.713 に答える
1

あなたはsedが利用可能だと言ったので、sedでソリューションをテストしました。次のようにしてうまくいくはずです:

sed -i -e 's:\bfirstNeedle\b:firstReplacement:g' -e 's:\bsecondNeedle\b:secondReplacement:g' [... and so on...] /path/to/first/file /path/to/second/file [etc...]

フラグはその-i場で編集することを意味します(したがって、提供された元のファイルが上書きされます(もちろん、事前にフォルダーのバックアップを作成します)。各置換は、-eフラグ(式)を使用して簡単に提供されます。置換自体はs、置換を意味します。 、その後に区切り文字、置き換えたいものに一致する正規表現、別の区切り記号、次に使用したい置換が続きます; これは正規表現からのグループ化も使用できるため、次のことを行うことができます (またはその他のそのようなトリック):

sed -i -e 's:\bget(([A-Z]{1,3})[a-zA-Z]*\(\)):g\1:g'

これはゲッターに一致し、それらを g[first-1-to-3-letters-of-next-word] に置き換えて、簡単に短縮します。もちろん、これは一意性を保証するものではありません。自分で確認する必要があります。

行う置換が多数ある場合は、それらをペアとしてファイルにoriginal=replacement(1 行に 1 つ) 配置して式を作成し、 を使用echo $(sed -e "s:([^=]*)=(.*):-e\ 's=\b\1\b\2=g':" /path/to/replacements/file)して置換のリストを出力できます。(ここでは=、置換ファイルを理解しやすくし、再利用しやすくするために区切り文字として使用しています。必要な区切り文字を自由に使用してください)。

于 2012-09-13T08:59:52.490 に答える