使用 grep 打印整数文字的问题
Problems using grep to print integer literals
我正在尝试使用正则表达式来匹配和打印出具有整数文字的行,但我似乎无法让它工作。我已经使用正则表达式教程进行了部分匹配,并提出了
(-|=)?([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);
}
您需要像下面这样更改您的 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]+'
我正在尝试使用正则表达式来匹配和打印出具有整数文字的行,但我似乎无法让它工作。我已经使用正则表达式教程进行了部分匹配,并提出了
(-|=)?([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);
}
您需要像下面这样更改您的 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]+'