我编写了这段代码,用于查找在字符串 str 中找到“匹配”模式的文件并打印出来。
#include <regex.h>
#include <string.h>
#include <stdio.h>
int main(int argc, const char *argv[]) {
char *str = strdup("aaaaaaa match aaaaaaaaaaaaaaaaaaaa\n"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
"cc match ccccccccccccccccccccccccc");
regex_t regex;
regmatch_t match;
regcomp(®ex, "match", REG_EXTENDED);
while(regexec(®ex, str, 1, &match, 0) != REG_NOMATCH) {
int beg = match.rm_so;
int end = match.rm_eo;
int len = end-beg;
char *match_string = str+beg;
match_string[len] = '\0';
printf("%s\n", match_string);
str = str + end + 1;
}
return 0;
}
我的问题是我需要找到比赛开始的哪一行。最好这应该适用于多线匹配,但现在单线很好。正则表达式有一些隐藏的功能,我可以用它来解决这个问题吗?
答案 0 :(得分:1)
您可以使用strtok()
解析这些行,以便在每\n
分割字符串。
此外,可以使用struct
来存储每一行:
typedef struct {
char *str;
size_t lineno;
} line_t;
然后,一旦知道字符串中存在多少\n
,就可以创建一个结构数组:
line_t *lines = malloc((numlines+1) * sizeof(line_t));
每一行都将如下存储:
Line 1: "aaaaaaa match aaaaaaaaaaaaaaaaaaaa"
Line 2: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
Line 3: "cc match ccccccccccccccccccccccccc";
然后您可以再次使用strtok()
来检查空格之间的模式。要比较字符串,strcmp
将很好用。
以下是一些示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *str;
size_t lineno;
} line_t;
int main(void) {
char str[] = "aaaaaaa match aaaaaaaaaaaaaaaaaaaa\n"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
"cc match ccccccccccccccccccccccccc";
const char *key = "match";
const char *delim1 = "\n";
const char *delim2 = " ";
char *pattern;
size_t numlines = 0, count = 0;
for (size_t i = 0; str[i]; i++) {
if (str[i] == '\n') {
numlines++;
}
}
line_t *lines = malloc((numlines+1) * sizeof(line_t));
if (!lines) {
printf("Cannot allocate %zu members\n", numlines+1);
exit(EXIT_FAILURE);
}
pattern = strtok(str, delim1);
while (pattern != NULL) {
lines[count].str = malloc(strlen(pattern)+1);
if (!lines[count].str) {
printf("Cannot allocate %zu bytes\n", strlen(pattern)+1);
exit(EXIT_FAILURE);
}
strcpy(lines[count].str, pattern);
lines[count].lineno = count+1;
count++;
pattern = strtok(NULL, delim1);
}
for (size_t i = 0; i < count; i++) {
pattern = strtok(lines[i].str, delim2);
while (pattern != NULL) {
if (strcmp(pattern, key) == 0) {
printf("pattern '%s' found on line %zu\n", key, lines[i].lineno);
}
pattern = strtok(NULL, delim2);
}
free(lines[i].str);
lines[i].str = NULL;
}
free(lines);
lines = NULL;
return 0;
}
答案 1 :(得分:0)
在此代码中,我将所有匹配保存到链表,然后通过字符串查找匹配行。它似乎在大多数情况下运作良好。如果有人知道更好的解决方案,请告诉我。
awk '$2 ~ /127.1.[0-9]+.[0-9]+/{$NF="NEWVAR2";print;next} $2 ~ /127.2.[0-9]+.[0-9]+/{$NF="NEWVAR3";print;next} $2 ~ /127.[0-9]+.[0-9]+.[0-9]+/{$NF="NEWVAR1";print;next}1' Input_file