我正在尝试找到一种使用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
}
}
3条答案
按热度按时间dkqlctbz1#
定义一个描述所有ASCII字符的字符集(码位32到127==
[\x20-\x7F]
),然后用^
否定它,以匹配任何非ASCII字符!让我们用我的(非ASCII)名字来测试它:
要筛选字符串列表,只需在筛选模式下使用
-cmatch
运算符:或者,如果要沿管道进行过滤,请使用
Where-Object
:kwvwclae2#
下面是一个脚本,我必须从一个XML文件中删除非ASCII字符。也许你可以把它作为一个起点。我正在删除ascii table中不在空格和波浪号之间的字符,也不会删除制表符。对我来说,ASCII在0-127的范围内。Get-Content去掉了回车符和换行符。
mzillmmw3#
.NET正则表达式引擎支持“非ASCII字符”概念的直接表达:
\P{IsBasicLatin}
(相反,即“ASCII字符”,为\p{IsBasicLatin}
):IsBasicLatin
是命名(Unicode)块的一个示例。上面使用
-cmatch
(-match
的区分大小写的变体)、正则表达式匹配运算符[1]来输出那些至少包含一个非ASCII范围字符的输入行(数组元素):对于流解决方案-处理从文件中逐个读取的行,您可以将
-match
与Where-Object
cmdlet结合使用:请注意,
Get-Content
用于逐行读取文件-虽然System.IO.File]::ReadLines("$pwd\in.txt")
也可以工作,但只有在出现性能问题时才需要这样做。[1]原因是不区分大小写匹配时,小写的ASCII
i
和k
字符都被视为ASCII块内部和*之外,即'i' -match '\P{IsBasicLatin}'
和'i' -match '\p{IsBasicLatin}'
都是$true
。有关说明,请参阅this answer。向js2010致敬。