Powershell在文本文件中查找非ASCII字符



我正在尝试找到一种方法使用Powershell脚本执行以下操作。

  1. 对于文本文件中的每一行,检查该行是否包含非 ASCII 字符
  2. 如果行包含非 ASCII 字符,则输出到单独的文件
  3. 如果行不包含非 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

对于流式处理解决方案- 逐个从文件中读取的行,可以将-matchWhere-Objectcmdlet 结合使用:

Get-Content in.txt | 
Where-Object { $_ -cmatch 'P{IsBasicLatin}' } |
Set-Content -Encoding Utf8 out.txt

请注意,Get-Content用于逐行读取文件 - 虽然System.IO.File]::ReadLines("$pwdin.txt")也可以,但只有在存在性能问题时才需要。


[1] 原因是对于不区分大小写的匹配,小写 ASCIIik字符在 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]

相关内容

  • 没有找到相关文章

最新更新