我想删除文本文件中在Powershell中具有非英语字符的所有行,这是到目前为止我已经尝试过的操作:
Where-Object {( $_ -notlike '[\x00-\x7F]+' ) -or ( $_ -notlike '[\u4e00-\u9fff]')}
但是,亚洲字符(日语,韩语和俄语)仍然存在,并且没有被删除,如下所示:
多発性硬化
多発性硬化症
다발 경화증
다발성 경화증
タハツセイコウカショウ
Рассеянный склероз
有人可以指出我的代码有什么问题吗?谢谢!
答案 0 :(得分:3)
尝试以下操作:
PS> 'english only', 'mixed 多発性硬化', '多発性硬化', 'mixed склероз', 'склероз' |
Where-Object { $_ -cnotmatch '[^\p{IsBasicLatin}]' }
english only
\p{IsBasicLatin}
匹配任何ASCII范围内的字符(7位Unicode代码点范围内的任何字符,0x0 - 0x7f
)
[^\p{IsBasicLatin}]
因此匹配任何 non -ASCII字符。
-cnotmatch '[^\p{IsBasicLatin}]'
仅匹配包含 no 非ASCII字符的字符串,换句话说:仅包含 ASCII范围字符的字符串。
答案 1 :(得分:0)
如果您确实要使用-notlike,则这里是一个演示,它使用通配符。这不包括u + 0000-u + 007F或u + 4e00-u + 9fff。最终却无法正常工作。 保存在其中的文件必须支持完整的Unicode代码点,在Powershell 5中支持utf8 with bom 。
$mynull = [char]0x00
'多発性硬化',
'多発性硬化症',
'다발 경화증',
'다발성 경화증',
'タハツセイコウカショウ',
'Рассеянный склероз',
'abc' | where { $_ -notlike "*[$mynull-⌂]*" -or $_ -notlike '*[一-鿿]*' }
多発性硬化
多発性硬化症
다발 경화증
다발성 경화증
タハツセイコウカショウ
Рассеянный склероз
abc
一个有效的例子。 (我之前将$ end转换为十六进制错误。)
$beg = [char]0x420
$end = [char]0xff8a
$mystrings = '多発性硬化',
'多発性硬化症',
'다발 경화증',
'다발성 경화증',
'タハツセイコウカショウ',
'Рассеянный склероз',
'?', # 2 surrogate characters in range
'abc'
$mystrings | where { $_ -cnotlike "*[$beg-$end]*" }
#$mystrings | % { $ints = [int[]][char[]]$_; $ints} | sort
#1056-65418
abc