2

ログ ファイル内のいくつかの特別な行を削除しようとしているので、組み込みの Linux システムで sed of busybox を使用しています。

# sed
BusyBox v1.18.4 (2013-01-16 16:00:18 CST) multi-call binary.

Usage: sed [-efinr] SED_CMD [FILE]...

Options:
        -e CMD  Add CMD to sed commands to be executed
        -f FILE Add FILE contents to sed commands to be executed
        -i      Edit files in-place (else sends result to stdout)
        -n      Suppress automatic printing of pattern space
        -r      Use extended regex syntax

If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none).
  1. シェルで次のコマンドを実行すると、すべて正常に動作します。

    export MODULE=sshd
    sed "/$MODULE\[/d" logfile
    
  2. しかし、これを達成するために次の C コードを使用しようとすると:

    char logfile[] = "logfile";
    char module_str[] = "sshd";
    char env_str[64] = {0};
    int offset = 0;
    
    strcpy(env_str, "MODULE=");
    offset += strlen("MODULE=");
    strcpy(env_str + offset, module_str);
    putenv(env_str);
    system("sed \"/$MODULE\[/d\" logfile");
    

a.out を実行すると、次のエラー メッセージが表示されました。

sed: unmatched '/'

「system()」呼び出しの何が問題になっていますか? 私はテキスト処理の初心者なので、誰かが私に手がかりを与えることができますか? ありがとう。

よろしく、 dejunl

4

1 に答える 1

2

すぐに、[ の前の \ が 'C' に飲み込まれようとしていることがわかります。

2倍にする必要があるので、

system("sed \"/$MODULE\\[/d\" ログファイル");

でも殻は残ったものを飲み込みたがるかもしれないそれを飲み込むのでまた2倍にする

system("sed \"/$MODULE\\\\[/d\" ログファイル");

もちろん system("sed \"/$MODULE\\[/d\" logfile"); あなたが提起した質問を読んでいると確信できません。sed の代わりに echo で試して、sed に見せたい文字列が出るまで調整します。

于 2013-02-03T09:46:11.670 に答える