0

私はネットで検索しましたが、コードmが書くことができるのはパターンの単一の出現のためだけであるため、それを行う方法の正確なアイデアを得ることはできませんでしたが、そのパターンの出現の異なる行がある場合??

4

1 に答える 1

4

Unix または同様のシステム (Linux や MacOS X など) を使用している場合は、これを行うためのコマンド ライン プログラムが既に用意されていますsed

それ以外の場合は、元のファイルから読み取って新しいファイルに書き込み、読み取りと書き込み中にテキストを置き換える必要があります。その後、新しいファイルの名前を古い元のファイルに変更する必要があります。

テキストの実際の検索に関しては、それが固定文字列の場合、たとえば使用できます。そうでない場合は、正規表現strstrを調べます。

編集:それを行う方法sed(1)

$ sed -i 's/xyz/abc/g' infile.txt

上記のコマンドは、 を読み取りinfile.txt、出現するすべてのテキストxyzをに置き換えabc、 に書き戻しinfile.txtます。

編集:検索/置換方法:

FILE *input = fopen("input.txt", "r");
FILE *output = fopen("temp.txt", "w");

char buffer[512];
while (fgets(buffer, sizeof(buffer), input) != NULL)
{
    /* The text to find */
    static const char text_to_find[] = "xyz";

    /* The text to replace it with */
    static const char text_to_replace[] = "abc";

    char *pos = strstr(buffer, text_to_find);
    if (pos != NULL)
    {
        /* Allocate memory for temporary buffer */
        char *temp = calloc(
            strlen(buffer) - strlen(text_to_find) + strlen(text_to_replace) + 1, 1);

        /* Copy the text before the text to replace */
        memcpy(temp, buffer, pos - buffer);

        /* Copy in the replacement text */
        memcpy(temp + (pos - buffer), text_to_replace, strlen(text_to_replace));

        /* Copy the remaining text from after the replace text */
        memcpy(temp + (pos - buffer) + strlen(text_to_replace),
               pos + strlen(text_to_find),
               1 + strlen(buffer) - ((pos - buffer) + strlen(text_to_find)));

        fputs(temp, output);

        free(temp);
    }
    else
        fputs(buffer, output);
}

fclose(output);
fclose(input);

/* Rename the temporary file to the original file */
rename("input.txt", "temp.txt");

このコードは動作することがテストされています。

注:ポインター演算が何であるかを知らない場合、上記のコードを理解して理解するのは非常に難しいかもしれません。:)

于 2012-09-05T11:11:53.450 に答える