命令如何查找有中文字符的行
命令如何查找有中文字符的行
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 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个字符。
dos时代菜鸟 发表于 2022-5-19 09:18
先做个字典包含 键盘常规字符,然后 ,读取文件每一行,逐行逐字符判断,如果该字符不在 字典中,就 ...
谢谢!
我用findstr 的下面的参数都很难实现查找有中文字符的行
[^class]
这个 ^ 太麻烦。 本帖最后由 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') findstr /r /c:"[^- '!-Z]" text.txt szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt
查找效率确实高,原版boot.wim镜像的文件列表中,随意加入一些中文,几乎秒查出带中文的行
命令行中的"Z",不能换成小写的"z",否则,凡是有大写Z的行也要被查找出来,这是什么原因? szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt
还有高手!
请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。 yjqd 发表于 2022-5-19 20:17
查找效率确实高,原版boot.wim镜像的文件列表中,随意加入一些中文,几乎秒查出带中文的行
命令行中的 ...
如果是文件列表,则范围可以更小了,有不少字符是不能作文件名的。
不知道你要Z还是z,将需求说得更明确些好。这个是用了[^class],当然也可实现。 nttwqz 发表于 2022-5-19 20:26
还有高手!
请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。
当时正好要午睡了zzz,只是随便百度的的,正则费脑的,多想容易睡不着。 szwp 发表于 2022-5-20 08:06
如果是文件列表,则范围可以更小了,有不少字符是不能作文件名的。
不知道你要Z还是z,将需求说得更明确 ...
谢谢!
我是需要在文本中只查找带有中文字符的行
我昨天测试的时候,把Z写成z了,结果是没有中文字符的行但有大写的的Z的行也被查找出来了 yjqd 发表于 2022-5-20 08:46
谢谢!
我是需要在文本中只查找带有中文字符的行
俺喜欢复制粘贴,省事啊。 nttwqz 发表于 2022-5-19 20:26
还有高手!
请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。
就一楼给的测试数据,用 findstr /r /c:"[^ a-z0-9]" text.txt 就可以了,这样是不是更容易理解些? szwp 发表于 2022-5-20 09:09
就一楼给的测试数据,用 findstr /r /c:"[^ a-z0-9]" text.txt 就可以了,这样是不是更容易理解些?
谢谢!
这个相对容易理解了,我昨天也写过这样的命令,但^和a-z0-9之间没空一格,导致所有行查出来了
^后空一格是什么意思
另外,你昨天的命令是不是更适合任何内容的文本,不一定是文件列表的文本,比如dism的log日志
yjqd 发表于 2022-5-20 09:25
谢谢!
这个相对容易理解了,我昨天也写过这样的命令,但^和a-z0-9之间没空一格,导致所有行查出来了
...
你要什么东西,就提供原始和结果的附件。正则是有书的,需要时间去掌握。 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
yjqd 发表于 2022-5-20 09:53
谢谢,不好意思,麻烦了
关于字符集里字母的大小写也影响结果
test.txt:
没看出啥问题来,你要哪种结果呢? 欢迎进群1067888280有答案 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
谢谢!,麻烦了
yjqd 发表于 2022-5-20 10:15
我不是否定你写的命令,我的意思是:比如我有时候没注意字符集里字母的大小写,会影响我只查找带中文字符 ...
这东西得你自己试的啊,你要忽略大小写在样本里提供也方便别人写啊,牙膏是挤不完的。
findstr /rc:"[^ a-z0-9A-Z]" text.txt bjay2008xmy 发表于 2022-5-20 10:21
难道不是ascii码,-到'和!到Z吗
'前面为什么有空格? szwp 发表于 2022-5-20 10:34
这东西得你自己试的啊,你要忽略大小写在样本里提供也方便别人写啊,牙膏是挤不完的。
findstr /rc:"[ ...
非常感谢
我水平有限,不明其理只能胡乱测试,所以伸手向各位坛友求助 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
正则写法不是唯一的,多试好为,复制粘贴可以少走弯路。 得学会 /?
findstr /?
/I 指定搜索不分大小写。 nttwqz 发表于 2022-5-20 10:39
'前面为什么有空格?
样本里有不少空格啊。如果是8.3格式就不需要了。 bjay2008xmy 发表于 2022-5-20 12:50
^[%u4e00-%u9fa5]{0,}$这个正则表达式说是识别中文,咋没用呢
@echo off
中文是个比较复杂的事,国内第一代标准是GB2312-1980,含6千多个汉字,采用的是高位都为1的双字节方案。港台还有hz big5到gbk还没完,到后面还有四字节的中文。
他没说这个正则是什么编码的中文的话,你得去问问他适应范围。
页:
[1]
2