删除Powershell中具有非英语字符的行

时间:2020-07-21 21:19:01

标签: regex powershell

我想删除文本文件中在Powershell中具有非英语字符的所有行,这是到目前为止我已经尝试过的操作:

Where-Object {( $_ -notlike '[\x00-\x7F]+' ) -or ( $_ -notlike '[\u4e00-\u9fff]')}

但是,亚洲字符(日语,韩语和俄语)仍然存在,并且没有被删除,如下所示:

多発性硬化
多発性硬化症
다발 경화증
다발성 경화증
タハツセイコウカショウ
Рассеянный склероз

有人可以指出我的代码有什么问题吗?谢谢!

2 个答案:

答案 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范围字符的字符串。

    • 注意帽子尖指向js2010的指针。-cnotmatch,不区分大小写{的区分大小写 故意使用{1}}运算符,以排除那些将ASCII范围字母视为一些特殊的非ASCII范围字符的小写字母等价字符的特殊情况,特别是-notmatch(带小写点的拉丁字母大写字母I ,U+0130),对于ASCII İ,则将其视为小写字母, 和i(开尔文符号,U+212A),它对应于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
相关问题