linux下C的正则表达

最近帮一位学长处理一些气象数据
shell脚本有很多这种命令可以来处理
但好久没碰这些了,颇有些生疏
这次主要想通过c语言来操作
linux底下有个正则表达式的函数库
头文件— regex.h

不废话了

以下直接上代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

int main()
{
    //char *test="09:00:00.676: <- $WIMWV,153.1,R,14.8,N,A*18"; 
    //上面为采集数据格式 主要获取首部的时间 R,参数前面的风向 N,前的风速
    const char *pattern="([0-9,:]{8}).[0-9]{3}[^0-9]{11},(.*),[R,T],(.*),[K,N,S],[A,V][*]\\w{2}";  //正则表达式格式 
    //一般形如[]{}格式,前者内容,后者长度, ()用来获取对应匹配
    regex_t reg; //结构体数据类型 用来存放编译后的正则表达式
    int err,nm=5; 
    char errbuf[100]={0}; //错误提示缓冲区
    char match[100]={0}; //用于记录匹配后的字符串
    regmatch_t pmatch[nm]; //结构体存放匹配串在目标串中的开始和结束位置

    //把制定的正则表达式pattern编译成一种特定的数据格式,增加匹配效率
    if(err=regcomp(&reg,pattern,REG_EXTENDED)<0){
        regerror(err,&reg,errbuf,sizeof(errbuf)); //判断是否正常 
        printf("err:%s\n",errbuf);
    }
    int i=0;
    int len=0;

    //一读一写
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    if((fp1=fopen("wind.txt","r"))==NULL){
        printf("open wind error\n"); 
        exit(-1);
    }
    fp2=fopen("wind_handle.txt","w+");
    char lineData[50]={0}; //存放从文本中取出的一行字符串
    while(!feof(fp1))
    {
        memset(lineData,0,sizeof(lineData));
        fgets(lineData,sizeof(lineData),fp1); //读入n-1,最后加'\0'
        //在读完n-1字符前遇到'\n'或结束符EOF,读入即结束
        //printf("%s\n",lineData);

        err=regexec(&reg,lineData,nm,pmatch,0); //开始匹配
        if(err==REG_NOMATCH){
            printf("no match\n"); 
            exit(-1);
        }else if(err){
            regerror(err,&reg,errbuf,sizeof(errbuf)); 
            printf("err:%s\n",errbuf);
            exit(-1);
        } 
        for(i=1;i<5&&pmatch[i].rm_so!=-1;i++){
            len=pmatch[i].rm_eo-pmatch[i].rm_so;
            if(len){ //如果有获取到匹配
                memset(match,'\0',sizeof(match)); 
                memcpy(match,lineData+pmatch[i].rm_so,len); //对应位置copy到缓冲区
                //printf("%s\n",match);
                fprintf(fp2,"%s\t",match); //写入文件(缓冲处) \t分割
            }
        }
        fprintf(fp2,"\n");
        fflush(fp2); //清空操作缓存,把数据写入文件中
    }
    regfree(&reg); //清空compiled指向的regex_t结构体内容
    //重新编译的话,一定要先清空regex_t结构体
    close(fp1);
    close(fp2);
    return 0;
}

正则表达对于处理数据来说不可或缺
大家可以多了解了解

### 使用 `grep` 工具进行正则表达式文本筛选 在 Linux 环境下,`grep` 是一种非常强大的命令行工具,可以用来通过正则表达式匹配文件中的特定字符串并显示这些行。以下是关于如何使用 `grep` 进行基于正则表达式的文本筛选的相关说明。 #### 基础语法 `grep` 的基本语法如下所示: ```bash grep [选项] '正则表达式' 文件名 ``` 其中 `[选项]` 可以控制输出的行为以及匹配的方式,而 `'正则表达式'` 则是用来指定要查找的内容[^2]。 #### 正则表达式支持 `grep` 支持两种类型的正则表达式:基础正则表达式 (BRE) 和扩展正则表达式 (ERE)[^1]。默认情况下,`grep` 使用的是基础正则表达式;如果需要启用扩展正则表达式,则可以通过 `-E` 或者 `egrep` 来实现。 ##### 一些常用的选项及其作用 - `-i`: 忽略大小写差异。 - `-v`: 显示不匹配的那些行。 - `-n`: 输出匹配行的同时打印出行号。 - `-c`: 统计匹配到的行数而不是输出具体的行内容。 - `-l`: 打印含有匹配项的文件名称而非实际内容。 - `-r`: 对目录下的所有文件递归地执行搜索操作。 - `-o`: 仅显示被匹配的部分文字而不是整个行。 #### 实际应用案例 下面是一些具体的应用场景例子: 1. **简单的单词搜索** 查找名为 testfile.txt 的文档里所有的 "example" 字样: ```bash grep 'example' testfile.txt ``` 2. **忽略大小写的搜索** 如果希望无论输入 Example, EXAMPLE 都能查找到对应的结果,那么加上参数 -i 即可做到这一点: ```bash grep -i 'Example' testfile.txt ``` 3. **反向选择** 若要找出不含某个关键词的所有行,可以用-v 参数来完成这个需求: ```bash grep -v 'notwantedword' testfile.txt ``` 4. **多文件检索** 当面对多个待检视的目标档案时,可以直接将它们列出来作为最后一个参数传给 grep ,或者利用通配符 * 表达更广泛的范围: ```bash grep 'searchterm' file1.txt file2.txt ... grep 'searchterm' *.txt ``` 5. **递归遍历子目录内的所有文件** 要在一个包含许多层次结构的资料夹里面寻找符合条件的信息,可以借助-r 参数来进行全盘扫描: ```bash grep -r 'pattern' /path/to/directory/ ``` 6. **只提取匹配部分** 若只需要知道哪些片段真正符合我们的条件而不关心上下文环境的话,就可以采用-o 参数单独摘取下来: ```bash echo "<tag>content</tag>" | grep -o '<.*>' ``` 7. **结合扩展正则表达式** 想要用更加灵活复杂的规则去过滤数据的时候,记得开启 ERE 功能: ```bash egrep '(first|second)' somefile.txt # 或者等价于 grep -E '(first|second)' somefile.txt ``` 以上就是有关如何运用 `grep` 结合正则表达式达成高效精准的数据挖掘目的介绍。 ```python # 示例 Python 代码展示如何调用系统命令运行上述 grep 方法 import subprocess def run_grep(pattern, filename): result = subprocess.run(['grep', pattern, filename], capture_output=True, text=True) return result.stdout print(run_grep('your_pattern_here', 'your_file_name_here')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值