使用grep打印整数文字的问题

时间:2015-02-18 05:06:32

标签: regex unix grep

我试图使用正则表达式匹配并打印出具有整数文字的行,但我似乎无法使其正常工作。我使用正则表达式教程完成了部分匹配,并提出了

( - | =)?([0-9])

我尝试将它放在grep中,但它不会为我的文件输出任何内容。我正在做

grep "(-|=)?([0-9])" my_fork.c

我还查看了之前的堆栈溢出问题(Printing out integer literals occurences on unix),并试图使用他的方法,但它也没有给我任何东西,所以我有点困惑。有人可以帮我搞这个正则表达式吗?

这是我的上下文文件

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

void processPrint(char * argv[], char * test, int i){
    int j = 0;
    for(; j < atoi(argv[1]); j++){
        printf("PID: %d %c\n", getpid(), test[i]);
        fflush(stdout);
    }
    exit(0);
}


void mainProcess(char * argv[], pid_t * childArray, int i, pid_t process){
    int j = 0;
    for(; j < atoi(argv[1]); j++){
        printf("PID: %d A\n", getpid());
        fflush(stdout);
    }
    childArray[i] = process;

}


void make_forks(pid_t process, char * argv[], pid_t * childArray, char * test){
    int i = 0, main_ran = 0;
    for(; i < 3; i++){
        if ((process=fork()) == 0){
            processPrint(argv, test, i);
        }
        else{
            if(!main_ran){
                mainProcess(argv, childArray, i, process);
            }
            main_ran = 1;
        }
    }
}

void wait_for_children(pid_t * childArray){
    int incomplete = 0;
    while(1){
        int i = 0;
        for(; i < 3; i++){
            if(childArray[i] > 0 && waitpid(childArray[i], NULL, WNOHANG) != 0 ){
                childArray[i] = 0;
            }
            else{ incomplete = 1; }
        }
        sleep(0);
        if(!incomplete){ break; }
    }
}

int main(int argc, char* argv[]){
    pid_t * childArray= malloc(12), process;
    char test[5] = "BCD";
    make_forks(process, argv, childArray, test);
}

1 个答案:

答案 0 :(得分:0)

您需要更改您的grep命令,如下所示。因为基本sed不支持可选的量词?,并且捕获组由\(...\)表示

$ echo '-5' | grep '\(-\|=\)*[0-9]' 
-5
$ echo '=5' | grep '\([-=]\)*[0-9]'
=5

$ echo '-5' | grep -E '[-=]?[0-9]' 
-5
$ echo '5' | grep -E '[-=]?[0-9]' 
5

如果您想匹配一个或多个数字,请在+旁边添加[0-9]

grep -E '[-=]?[0-9]+'