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

4ioopgfo  于 2022-11-10  发布在  Shell
关注(0)|答案(3)|浏览(175)

我正在尝试找到一种使用PowerShell脚本执行以下操作的方法。
1.对于文本文件中的每一行,检查行是否包含非ASCII字符
1.如果行包含非ASCII字符,则输出到单独的文件
1.如果行中不包含非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        
    }
}
dkqlctbz

dkqlctbz1#

定义一个描述所有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]'}
kwvwclae

kwvwclae2#

下面是一个脚本,我必须从一个XML文件中删除非ASCII字符。也许你可以把它作为一个起点。我正在删除ascii table中不在空格和波浪号之间的字符,也不会删除制表符。对我来说,ASCII在0-127的范围内。Get-Content去掉了回车符和换行符。

(get-content $args[0]) -replace '[^ -~\t]' | set-content $args[0]
mzillmmw

mzillmmw3#

.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-Object cmdlet结合使用:

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

请注意,Get-Content用于逐行读取文件-虽然System.IO.File]::ReadLines("$pwd\in.txt")也可以工作,但只有在出现性能问题时才需要这样做。
[1]原因是不区分大小写匹配时,小写的ASCII ik字符都被视为ASCII块内部和*之外,即'i' -match '\P{IsBasicLatin}''i' -match '\p{IsBasicLatin}'都是$true。有关说明,请参阅this answer。向js2010致敬。

相关问题