1

「UNIX スタイル」の行末 (各行の終わりに 0x0A) を含むテキスト ファイルがあります。

そのファイルを変更して新しいコンテンツを追加するスクリプトを書いています。これは、Windows で実行される JScript です。コードは次のようになります。

    var fso = new ActiveXObject("Scripting.FileSystemObject"),
        fs = fso.openTextFile(src),
        origContent = fs.readAll();
    fs.Close();
    fso.MoveFile(src, dest);

    // write updated content to a new file.
    fs = fso.CreateTextFile(src);
    fs.WriteLine("# key: " + keyvaluee);
    fs.WriteLine("# group: " + groupvalue);
    fs.WriteLine(origContent);
    fs.Close();

結果の変更されたファイルの内容は次のようになります。

00000000: 2320 6b65 793a 2075 6e64 6566 696e 6564  # key: undefined
00000010: 0d0a 2320 6772 6f75 703a 2069 6d61 700d  ..# group: imap.
00000020: 0a23 636f 6e74 7269 6275 746f 7220 3a20  .#contributor : 
00000030: 416e 6472 6577 2047 776f 7a64 7a69 6577  Andrew Gwozdziew
00000040: 7963 7a20 3c77 6562 4061 7067 776f 7a2e  ycz <web@apgwoz.
00000050: 636f 6d3e 0a23 6e61 6d65 203a 2069 6d61  com>.#name : ima
00000060: 705f 6765 745f 7175 6f74 6172 6f6f 7428  p_get_quotaroot(
00000070: 2e2e 2e2c 202e 2e2e 290a 2320 2d2d 0a69  ..., ...).# --.i
00000080: 6d61 705f 6765 745f 7175 6f74 6172 6f6f  map_get_quotaroo
00000090: 7428 247b 696d 6170 5f73 7472 6561 6d7d  t(${imap_stream}
000000a0: 2c20 247b 7175 6f74 615f 726f 6f74 7d29  , ${quota_root})
000000b0: 2430 0d0a                                $0..

ご覧のとおり、JScript TextStream で追加された行は で終わりますが0D 0A、既存のコンテンツは単純に で各行が終わります0A。位置 0x10 のシーケンスを参照し、位置 0x54 のバイトと比較します。これはテキスト ファイルです。内容を 16 進数で表示しています。

変更されたファイルで行末を一貫させるにはどうすればよいですか? どちらの方法でも問題ありませんが、同じファイルで両方を使用するのは好きではありません。

origContent「DOS スタイル」の行末を使用するようにメモリ内の文字列を変換できますか?

4

1 に答える 1

2

文字列を16進数エンコーディングに置き換えました。これは私にとってはうまくいきました。

var fso = new ActiveXObject("Scripting.FileSystemObject"),  
    fs = fso.openTextFile(src),  
    origContent = fs.readAll(),  
    re1 = new RegExp("\x0A", 'g');

fs.Close();  
fso.MoveFile(src, dest);  

// write updated content to a new file.  
fs = fso.CreateTextFile(src);  
fs.WriteLine("# key: " + keyvaluee);  
fs.WriteLine("# group: " + groupvalue); 
origContent = origContent.replace(re1, "\x0D\x0A");
fs.WriteLine(origContent);  
fs.Close();  

その結果、すべての行末がorigContentLF ではなく CR/LF に変換されます。これは、元のファイルに CRLF ペアがない場合にのみ機能します。元のファイルがすべて unix の行末である場合にのみ機能します。

于 2012-03-25T06:08:55.637 に答える