yjqd 发表于 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

dos时代菜鸟 发表于 2022-5-19 09:18:41

本帖最后由 dos时代菜鸟 于 2022-5-19 12:26 编辑

@echo off
setlocal ENABLEDELAYEDEXPANSION
set file1=test.txt
set "string1=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$*()_+`-=,.?/;"'{}[]\^|^<^>^&%%^^^^ "
for /f "delims=" %%c in ('type !file1!') do (
    call :str_x "%%c"
    if !found0! EQU 1 ECHO "%%c"
)

pause
goto :eof

:str_x
    set "str1=%~1"
    SET found0=0
    for /l %%i in (0,1,255) do (
      set ch=!str1:~%%i,1!
      if not "!ch!"=="" (
            set found1=0
            for /l %%n in (0,1,92) do (
                if "!ch!"=="!string1:~%%n,1!" set /a found1 +=1
            )
            if !found1! EQU 0 (
                set found0=1
                exit /b
            )
      ) else (exit /b)
    )
exit /b


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


yjqd 发表于 2022-5-19 09:25:18

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

谢谢!

我用findstr 的下面的参数都很难实现查找有中文字符的行

[^class]

dos时代菜鸟 发表于 2022-5-19 11:29:32

这个 ^ 太麻烦。

nttwqz 发表于 2022-5-19 11:41:28

本帖最后由 nttwqz 于 2022-5-19 22:45 编辑

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

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

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

import os, re
from chardet.universaldetector import UniversalDetector
from tkinter import filedialog

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

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

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

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

os.system('pause')

szwp 发表于 2022-5-19 12:13:01

findstr /r /c:"[^- '!-Z]" text.txt

yjqd 发表于 2022-5-19 20:17:17

szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt

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

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

nttwqz 发表于 2022-5-19 20:26:55

szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt

还有高手!

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

szwp 发表于 2022-5-20 08:06:51

yjqd 发表于 2022-5-19 20:17
查找效率确实高,原版boot.wim镜像的文件列表中,随意加入一些中文,几乎秒查出带中文的行

命令行中的 ...

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

szwp 发表于 2022-5-20 08:08:42

nttwqz 发表于 2022-5-19 20:26
还有高手!

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

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

yjqd 发表于 2022-5-20 08:46:44

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

谢谢!

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

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

szwp 发表于 2022-5-20 09:03:19

yjqd 发表于 2022-5-20 08:46
谢谢!

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


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

szwp 发表于 2022-5-20 09:09:55

nttwqz 发表于 2022-5-19 20:26
还有高手!

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

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

yjqd 发表于 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日志

szwp 发表于 2022-5-20 09:41:20

yjqd 发表于 2022-5-20 09:25
谢谢!

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

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

yjqd 发表于 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

szwp 发表于 2022-5-20 09:56:33

yjqd 发表于 2022-5-20 09:53
谢谢,不好意思,麻烦了
关于字符集里字母的大小写也影响结果
test.txt:


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

wuming520 发表于 2022-5-20 09:57:39

欢迎进群1067888280有答案

yjqd 发表于 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


谢谢!,麻烦了

bjay2008xmy 发表于 2022-5-20 10:21:11

szwp 发表于 2022-5-20 10:34:37

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

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

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

nttwqz 发表于 2022-5-20 10:39:59

bjay2008xmy 发表于 2022-5-20 10:21
难道不是ascii码,-到'和!到Z吗

'前面为什么有空格?

yjqd 发表于 2022-5-20 10:41:04

szwp 发表于 2022-5-20 10:34
这东西得你自己试的啊,你要忽略大小写在样本里提供也方便别人写啊,牙膏是挤不完的。

findstr /rc:"[ ...

非常感谢

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

szwp 发表于 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
正则写法不是唯一的,多试好为,复制粘贴可以少走弯路。

szwp 发表于 2022-5-20 10:48:56

得学会 /?
findstr /?
/I         指定搜索不分大小写。

bjay2008xmy 发表于 2022-5-20 11:40:21

szwp 发表于 2022-5-20 11:51:28

nttwqz 发表于 2022-5-20 10:39
'前面为什么有空格?

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

bjay2008xmy 发表于 2022-5-20 12:09:19

bjay2008xmy 发表于 2022-5-20 12:50:38

szwp 发表于 2022-5-20 13:00:14

bjay2008xmy 发表于 2022-5-20 12:50
^[%u4e00-%u9fa5]{0,}$这个正则表达式说是识别中文,咋没用呢

@echo off


中文是个比较复杂的事,国内第一代标准是GB2312-1980,含6千多个汉字,采用的是高位都为1的双字节方案。港台还有hz big5到gbk还没完,到后面还有四字节的中文。
他没说这个正则是什么编码的中文的话,你得去问问他适应范围。
页: [1] 2
查看完整版本: 命令如何查找有中文字符的行