无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7266|回复: 61
打印 上一主题 下一主题

[求助] 命令如何查找有中文字符的行

  [复制链接]
跳转到指定楼层
1#
发表于 2022-5-19 07:38:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


命令如何查找有中文字符的行

test.txt内容如下:

Meng said the commission will step
one 129 ok
two78kl
three99 88 ui
thre99 88 ui6
bk高兴oewp
89爵士io
12听99
2#
发表于 2022-5-19 09:18:41 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-5-19 12:26 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set file1=test.txt
  4. set "string1=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$*()_+`-=,.?/;"'{}[]\^|^<^>^&%%^^^^ "
  5. for /f "delims=" %%c in ('type !file1!') do (
  6.     call :str_x "%%c"
  7.     if !found0! EQU 1 ECHO "%%c"  
  8. )

  9. pause
  10. goto :eof

  11. :str_x
  12.     set "str1=%~1"
  13.     SET found0=0
  14.     for /l %%i in (0,1,255) do (
  15.         set ch=!str1:~%%i,1!
  16.         if not "!ch!"=="" (
  17.             set found1=0
  18.             for /l %%n in (0,1,92) do (
  19.                 if "!ch!"=="!string1:~%%n,1!" set /a found1 +=1
  20.             )
  21.             if !found1! EQU 0 (
  22.                 set found0=1
  23.                 exit /b
  24.             )
  25.         ) else (exit /b)
  26.     )
  27. exit /b
复制代码



先做个字典包含 键盘常规字符,然后 ,读取文件每一行,逐行逐字符判断,如果该字符不在 字典中,就判定为 中文。假定 文件每行最多 256个字符。


点评

谢谢! 我用findstr 的下面的参数都很难实现查找有中文字符的行 [class] [^class] [x-y]  详情 回复 发表于 2022-5-19 09:25
回复

使用道具 举报

3#
 楼主| 发表于 2022-5-19 09:25:18 | 只看该作者
dos时代菜鸟 发表于 2022-5-19 09:18
先做个字典包含 键盘常规字符,然后 ,读取文件每一行,逐行逐字符判断,如果该字符不在 字典中,就 ...

谢谢!

我用findstr 的下面的参数都很难实现查找有中文字符的行
[class]
[^class]
[x-y]
回复

使用道具 举报

4#
发表于 2022-5-19 11:29:32 | 只看该作者
这个 ^ 太麻烦。
回复

使用道具 举报

5#
发表于 2022-5-19 11:41:28 来自手机 | 只看该作者
本帖最后由 nttwqz 于 2022-5-19 22:45 编辑

python 3.10.4,简单试了一下,可用。

20220519
更新下,增加chardet检测文件编码,简单测试下,常见的ANSI、UTF-8、Unicode识别正常,其它编码未知。

  1. # -*- coding: utf-8 -*-
  2. # Python 3.10.4
  3. # chardet是第三方库,需要在cmd中输入pip install chardet手动安装

  4. import os, re
  5. from chardet.universaldetector import UniversalDetector
  6. from tkinter import filedialog

  7. with filedialog.askopenfile(filetypes=[('文本文件', ['*.txt', '*.log']), ('所有文件', '*.*')]) as f:
  8.     txtfile = f.name
  9.     fname, fext = os.path.splitext(f.name)

  10. # 使用 chardet 库判断文件编码
  11. with open(txtfile, 'rb') as f:
  12.     u = UniversalDetector()
  13.     for i in f:
  14.         u.feed(i)
  15.         if u.done:      # 当识别出编码后,done的值为True,否则为False
  16.             u.close()
  17.             current_encoding = u.result['encoding']
  18.             break
  19.     if not u.done:
  20.         current_encoding = input('无法识别文件编码,请手动输入:')

  21. with open(txtfile, mode='r', encoding=current_encoding) as f:
  22.     print('查找文件 {} 中所有含中文的行\n'.format(os.path.abspath(f.name)))
  23.     sclines = ''
  24.     for line in f:
  25.         if re.search(r'[\u4e00-\u9fff]', line):
  26.             sclines += line

  27. # 生成含中文行的新文件,文件编码与源文件保持不变
  28. if sclines != '':
  29.     with open('{}_含中文的行{}'.format(fname, fext), mode='w', encoding=current_encoding) as f:
  30.         f.write(sclines)
  31.         print('含中文的行已写入到新文件:\n{}\n\n'.format(os.path.abspath(f.name)))
  32. else:
  33.     print('该文件不含中文!\n')

  34. os.system('pause')
复制代码
回复

使用道具 举报

6#
发表于 2022-5-19 12:13:01 | 只看该作者
findstr /r /c:"[^- '!-Z]" text.txt
回复

使用道具 举报

7#
 楼主| 发表于 2022-5-19 20:17:17 | 只看该作者
szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt

查找效率确实高,原版boot.wim镜像的文件列表中,随意加入一些中文,几乎秒查出带中文的行

命令行中的"Z",不能换成小写的"z",否则,凡是有大写Z的行也要被查找出来,这是什么原因?
回复

使用道具 举报

8#
发表于 2022-5-19 20:26:55 | 只看该作者
szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt

还有高手!

请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。
回复

使用道具 举报

9#
发表于 2022-5-20 08:06:51 | 只看该作者
yjqd 发表于 2022-5-19 20:17
查找效率确实高,原版boot.wim镜像的文件列表中,随意加入一些中文,几乎秒查出带中文的行

命令行中的 ...

如果是文件列表,则范围可以更小了,有不少字符是不能作文件名的。
不知道你要Z还是z,将需求说得更明确些好。这个是用了[^class],当然[class]也可实现。
回复

使用道具 举报

10#
发表于 2022-5-20 08:08:42 | 只看该作者
nttwqz 发表于 2022-5-19 20:26
还有高手!

请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。

当时正好要午睡了zzz,只是随便百度的的,正则费脑的,多想容易睡不着。
回复

使用道具 举报

11#
 楼主| 发表于 2022-5-20 08:46:44 | 只看该作者
szwp 发表于 2022-5-20 08:06
如果是文件列表,则范围可以更小了,有不少字符是不能作文件名的。
不知道你要Z还是z,将需求说得更明确 ...

谢谢!

我是需要在文本中只查找带有中文字符的行

我昨天测试的时候,把Z写成z了,结果是没有中文字符的行但有大写的的Z的行也被查找出来了
回复

使用道具 举报

12#
发表于 2022-5-20 09:03:19 | 只看该作者
yjqd 发表于 2022-5-20 08:46
谢谢!

我是需要在文本中只查找带有中文字符的行

俺喜欢复制粘贴,省事啊。
回复

使用道具 举报

13#
发表于 2022-5-20 09:09:55 | 只看该作者
nttwqz 发表于 2022-5-19 20:26
还有高手!

请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。

就一楼给的测试数据,用 findstr /r /c:"[^ a-z0-9]" text.txt 就可以了,这样是不是更容易理解些?
回复

使用道具 举报

14#
 楼主| 发表于 2022-5-20 09:25:57 | 只看该作者
szwp 发表于 2022-5-20 09:09
就一楼给的测试数据,用 findstr /r /c:"[^ a-z0-9]" text.txt 就可以了,这样是不是更容易理解些?

谢谢!

这个相对容易理解了,我昨天也写过这样的命令,但^和a-z0-9之间没空一格,导致所有行查出来了
^后空一格是什么意思

另外,你昨天的命令是不是更适合任何内容的文本,不一定是文件列表的文本,比如dism的log日志
回复

使用道具 举报

15#
发表于 2022-5-20 09:41:20 | 只看该作者
yjqd 发表于 2022-5-20 09:25
谢谢!

这个相对容易理解了,我昨天也写过这样的命令,但^和a-z0-9之间没空一格,导致所有行查出来了
...

你要什么东西,就提供原始和结果的附件。正则是有书的,需要时间去掌握。
回复

使用道具 举报

16#
 楼主| 发表于 2022-5-20 09:53:37 | 只看该作者
szwp 发表于 2022-5-20 09:41
你要什么东西,就提供原始和结果的附件。正则是有书的,需要时间去掌握。

谢谢,不好意思,麻烦了
关于字符集里字母的大小写也影响结果
test.txt:
Meng said the commission will step
one 129 ok
two78kl
three99 88 ui
thre99 88 ui6
中有粉因
bk高兴oewp
89爵士io
12听99
jkloppDZ
E:\win10pe10586制作\新建文件夹>findstr /r /c:"[^ A-z0-9]" test.txt
Meng said the commission will step
中有粉因
bk高兴oewp
89爵士io
12听99
jkloppDZ
E:\win10pe10586制作\新建文件夹>findstr /r /c:"[^ a-Z0-9]" test.txt
中有粉因
bk高兴oewp
89爵士io
12听99

E:\win10pe10586制作\新建文件夹>findstr /r /c:"[^ A-Z0-9]" test.txt
Meng said the commission will step
中有粉因
bk高兴oewp
89爵士io
12听99


E:\win10pe10586制作\新建文件夹>findstr /r /c:"[^ a-z0-9]" test.txt
中有粉因
bk高兴oewp
89爵士io
12听99
jkloppDZ

回复

使用道具 举报

17#
发表于 2022-5-20 09:56:33 | 只看该作者
yjqd 发表于 2022-5-20 09:53
谢谢,不好意思,麻烦了
关于字符集里字母的大小写也影响结果
test.txt:

没看出啥问题来,你要哪种结果呢?
回复

使用道具 举报

18#
发表于 2022-5-20 09:57:39 | 只看该作者
欢迎进群1067888280有答案
回复

使用道具 举报

19#
 楼主| 发表于 2022-5-20 10:15:25 | 只看该作者
szwp 发表于 2022-5-20 09:56
没看出啥问题来,你要哪种结果呢?

我不是否定你写的命令,我的意思是:比如我有时候没注意字符集里字母的大小写,会影响我只查找带中文字符的行的结果

即使就用这个命令,findstr /r /c:"[^ a-z0-9]",也把带Z的英文行查找出来了,而我只想查找有中文字符的行
test.txt:
Meng said the commission will step
one 129 ok
two78kl
three99 88 ui
thre99 88 ui6
中有粉因
bk高兴oewp
89爵士io
12听99
jkloppDZ



E:\win10pe10586制作\新建文件夹>findstr /r /c:"[^ a-z0-9]" test.txt
中有粉因
bk高兴oewp
89爵士io
12听99
jkloppDZ


谢谢!,麻烦了
回复

使用道具 举报

20#
发表于 2022-5-20 10:21:11 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

21#
发表于 2022-5-20 10:34:37 | 只看该作者
yjqd 发表于 2022-5-20 10:15
我不是否定你写的命令,我的意思是:比如我有时候没注意字符集里字母的大小写,会影响我只查找带中文字符 ...

这东西得你自己试的啊,你要忽略大小写在样本里提供也方便别人写啊,牙膏是挤不完的。

findstr /rc:"[^ a-z0-9A-Z]" text.txt
回复

使用道具 举报

22#
发表于 2022-5-20 10:39:59 来自手机 | 只看该作者
bjay2008xmy 发表于 2022-5-20 10:21
难道不是ascii码,-到'和!到Z吗

'前面为什么有空格?
回复

使用道具 举报

23#
 楼主| 发表于 2022-5-20 10:41:04 | 只看该作者
szwp 发表于 2022-5-20 10:34
这东西得你自己试的啊,你要忽略大小写在样本里提供也方便别人写啊,牙膏是挤不完的。

findstr /rc:"[ ...

非常感谢

我水平有限,不明其理只能胡乱测试,所以伸手向各位坛友求助
回复

使用道具 举报

24#
发表于 2022-5-20 10:46:35 | 只看该作者
yjqd 发表于 2022-5-20 10:41
非常感谢

我水平有限,不明其理只能胡乱测试,所以伸手向各位坛友求助

findstr /ric:"[^ a-z0-9]" text.txt
findstr /ric:"[^ A-z0-9]" text.txt
findstr /ric:"[^ a-Z0-9]" text.txt
findstr /ric:"[^ A-Z0-9]" text.txt
正则写法不是唯一的,多试好为,复制粘贴可以少走弯路。
回复

使用道具 举报

25#
发表于 2022-5-20 10:48:56 | 只看该作者
得学会 /?
findstr /?
/I         指定搜索不分大小写。
回复

使用道具 举报

26#
发表于 2022-5-20 11:40:21 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27#
发表于 2022-5-20 11:51:28 | 只看该作者
nttwqz 发表于 2022-5-20 10:39
'前面为什么有空格?

样本里有不少空格啊。如果是8.3格式就不需要了。
回复

使用道具 举报

28#
发表于 2022-5-20 12:09:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

29#
发表于 2022-5-20 12:50:38 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

30#
发表于 2022-5-20 13:00:14 | 只看该作者
bjay2008xmy 发表于 2022-5-20 12:50
^[%u4e00-%u9fa5]{0,}$这个正则表达式说是识别中文,咋没用呢

@echo off

中文是个比较复杂的事,国内第一代标准是GB2312-1980,含6千多个汉字,采用的是高位都为1的双字节方案。港台还有hz big5到gbk还没完,到后面还有四字节的中文。
他没说这个正则是什么编码的中文的话,你得去问问他适应范围。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-16 12:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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