我正在尝试找到一种方法使用Powershell脚本执行以下操作。
- 对于文本文件中的每一行,检查该行是否包含非 ASCII 字符
- 如果行包含非 ASCII 字符,则输出到单独的文件
- 如果行不包含非 ASCII 字符,请跳到下一行
非 ASCII 字符是指非键盘字符,例如重音字符、来自其他语言的字符等。
示例数据
- 张伟
- குழந்தைகளுக்கான பெயர்கள்
- 日本人の氏名
- Full Name
- Léna Rémi
输出数据
- 张伟
- குழந்தைகளுக்கான பெயர்கள்
- 日本人の氏名
- Léna Rémi
我在其他线程中找到了正则表达式来删除非 ASCII 字符,但我似乎无法使其工作。
请帮忙!
**编辑** 感谢大家的帮助!我已经设法用下面的脚本做了我想做的事情。
$nonASCII = "[^x00-x7F]"
foreach ($_ in [System.IO.File]::ReadLines($source)){
if ($_ -cmatch $nonASCII){
write-output $_ | out-File $output -append
}
}
定义一个描述所有 ASCII 字符(码位 32 到 127 ==[x20-x7F]
(的字符集,然后用^
将其否定以匹配任何非 ASCII 字符!
让我们根据我的(非 ASCII(名称测试它:
PS C:> 'Mathias R. Jessen' -cmatch '[^x20-x7F]'
False
PS C:> 'Mathias Rørbo Jessen' -cmatch '[^x20-x7F]'
True
要过滤字符串列表,只需在过滤模式下使用-cmatch
运算符:
$strings = 'குழந்தைகளுக்கான பெயர்கள்', 'Boring John Doe', 'Léna Rémi'
$nonASCIIstrings = @($strings) -cmatch '[^x20-x7F]'
或者,如果要沿管道进行筛选,请使用Where-Object
:
$strings |Where-Object {$_ -cmatch '[^x20-x7F]'}
.NET 正则表达式引擎支持"非 ASCII 字符"概念的直接表达:P{IsBasicLatin}
(相反,即"ASCII 字符",是p{IsBasicLatin}
(:
' - 张伟',
' - குழந்தைகளுக்கான பெயர்கள்',
' - 日本人の氏名',
' - Full Name',
' - Léna Rémi' -cmatch 'P{IsBasicLatin}'
IsBasicLatin
是命名(Unicode(块的示例。
上面需要-cmatch
,-match
[1]正则表达式匹配运算符的区分大小写的变体,以输出那些包含至少一个非ASCII范围字符的输入行(数组元素(:
- 张伟
- குழந்தைகளுக்கான பெயர்கள்
- 日本人の氏名
- Léna Rémi
对于流式处理解决方案- 逐个从文件中读取的行,可以将-match
与Where-Object
cmdlet 结合使用:
Get-Content in.txt |
Where-Object { $_ -cmatch 'P{IsBasicLatin}' } |
Set-Content -Encoding Utf8 out.txt
请注意,Get-Content
用于逐行读取文件 - 虽然System.IO.File]::ReadLines("$pwdin.txt")
也可以,但只有在存在性能问题时才需要。
[1] 原因是对于不区分大小写的匹配,小写 ASCIIi
和k
字符在 ASCII 块内外都被视为,即'i' -match 'P{IsBasicLatin}'
和'i' -match 'p{IsBasicLatin}'
都是$true
。有关解释,请参阅此答案。向 js2010 致
这是一个脚本,我必须从 xml 文件中删除非 ascii 字符。 也许你可以把它作为一个起点。 我正在删除 ascii 表中不在空格和波浪号之间的字符,也不是制表符。 对我来说,ascii 在 0-127 的范围内。 获取内容会取出回车符和换行符。
(get-content $args[0]) -replace '[^ -~t]' | set-content $args[0]