找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 17291|回复: 12

[问题求助] 求个shell的匹配命令

[复制链接]
发表于 2019-7-11 12:14:41 | 显示全部楼层 |阅读模式
有个10000行的纯文本文件,每行的字符是0,1,2的其中之一。求命令匹配符合条件的打印出提示字符串,如果文本中包括3等字符,
打印出不符合的提示字符串。
发表于 2019-7-11 15:14:56 | 显示全部楼层
请给一段测试文本及其希望得到的结果
 楼主| 发表于 2019-7-11 15:43:23 | 显示全部楼层
回复 2# Batcher

自己用C语言写了一下,如果有不匹配显示error和不匹配的的行。如果全部匹配,显示good和总行数。不知道这个Shell改怎么写?
想学习一下。

cek
error.
hangshu:7

cek
good.
hanshu:11
 楼主| 发表于 2019-7-11 15:44:21 | 显示全部楼层
回复 2# Batcher

示范文本

0
1
2
1
0
1
2
0
1
1
2

--------------------------------

0
1
2
1
5
1
2
0
1
1
2
发表于 2019-7-11 17:13:23 | 显示全部楼层
回复 4# netdzb


    这个示范文本是根据什么规律得出error. hangshu:7
 楼主| 发表于 2019-7-11 17:16:45 | 显示全部楼层
回复 5# Batcher

这里应该是5,因为我测试好把示范文本给删除了。
后来重新弄了一个就对不上了。
发表于 2019-7-11 17:23:59 | 显示全部楼层
建议楼主一开始就把需求说的明白,准确一些,有文本处理的最好有示例样本。
  1. awk '{if ($0 !~/[0-2]/) n++}END{if (n>0)printf("error,错误行数%d\n",n);else printf("good,总行数%d\n",NR)}' 1.txt
复制代码
发表于 2019-7-11 17:24:01 | 显示全部楼层
回复 6# netdzb


    把你写的C代码发出来看看。另外,如果有多个不匹配的行,应该怎么显示呢。
 楼主| 发表于 2019-7-11 18:13:59 | 显示全部楼层
本帖最后由 netdzb 于 2019-7-11 18:17 编辑

回复 8# Batcher

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

int main()
{
        char buffer[1024] = {0};
        int len = 0;
        int count = 0;
        int flag;     

        FILE *fp = fopen("cek.txt", "r");
        if(NULL == fp)
        {
                printf("failed to open cek.txt\n");
                return 1;
        }
        
        while(!feof(fp))
        {
        fgets(buffer, sizeof(buffer) - 1, fp);
        count += 1;
        if ( strnicmp(buffer,"0",1) ==0 || strnicmp(buffer,"1",1) ==0 || strnicmp(buffer,"2",1) ==0 )
           flag = 1;
        else
           {
              flag = 0;
              break;
           }      
        } // while
        if ( flag == 1 )
           printf("good.\n");
        else
           printf("error.\n");   
        fclose(fp);
        printf("hangshu:%d\n", count);
        return 0;
}

我就测试了几行,不知道对不对?
 楼主| 发表于 2019-7-11 18:50:39 | 显示全部楼层
回复 7# cfwyy77_bat


'{if ($0 !~/[0-2]/)

看看我对正则理解的对吗?
   
$0         表示 第一个字符
!           表示 不是
~           这个没看懂
/[0-2]     这个表示0,1,2
发表于 2019-7-11 19:55:16 | 显示全部楼层
回复 10# netdzb


    这需要看教程,而不是猜。
发表于 2019-7-12 08:10:17 | 显示全部楼层
回复 10# netdzb
如版主说的,要自己所有细节都理解,肯定要看教程。要在shell下处理文本,正则,awk,sed,grep这些跑不了的。建议楼主看看相关教程。

$0不是正则,是awk的当前一个记录,默认是当前的一行。
!~  表示   不匹配。
发表于 2019-7-12 10:56:28 | 显示全部楼层
回复 9# netdzb
  1. awk '{if($0!~/[0-2]/)n=NR}END{if(n>0)printf("error.\nhangshu:%d\n",n);else printf("good.\nhangshu:%d\n",NR)}' 1.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:33 , Processed in 0.017025 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表