2016-11-09 46 views
1

鉴于在私人使用区字符的文件,如:如何删除包含专用区域字符的行?

$ cat textfile.txt | less 
10 翴 30 <U+E4D1>  ten-thirty in ... three ... two ... one . 
- 10 翴 45だи<U+E145>砆 秂 <U+E18E>  it 's a slam-dunk . 
<U+E707> 10 翴 <U+E6C4>ㄓ ?  so you will be home by 10:00 ? 
10 翴 牧 よ<U+E6BC>ㄓ<U+E5EC> bogey at 10 o'clock . 
- 10 翴 牧 よ<U+E6BC>い盠  - ten o'clock , lieutenant , 10 o'clock ! 
10 翴 牧 よ<U+E6BC>绰玭 i see it , 8 o'clock , heading south ! 
10 翴 筁<U+E5EC>  it 's past 10:00 . 
<U+E80B>ぱ 10 翴 非<U+E1A0>筁ㄓ be here tomorrow , 10:00 sharp . 
- 10 , 老搭档 有 人 开枪 , 疑犯 拒捕 shots firing . suspect 's fleeing . 
- 1 -0 而已  - only 1-0 . 
- 1 -0 而已  - only 1-0 . 

如何删除一条线,如果有遇到超出Unicode字节点的任何字符?

我已经试过这样:

# ord(u'\uE000') == 57344 
for line in open('test.txt'): 
    if any(ord(i) >57344 for i in line): 
     pass 
    else: 
     print (line) 

但我似乎无法摆脱包含PUA字符的各线。

如何在unix bash中使用sed/awk或其他方法实现相同的功能而不是使用Python?

注意,我仍想保留是有效的Unicode而不是仅仅保持与ASCII字符行线。例如。我想保留最后三行的汉字,“......射击,嫌疑人逃跑”。 (出于某种原因,我无法在问题中键入中文部分,因为SO显示中文字符错误)。

+0

请注意,我不是要删除非英文字符。如果有任何字符落入PUA,我试图删除整行。我仍然想保持像' - 10,老搭档有人开枪,疑犯拒捕射击。嫌疑人逃跑。“# – alvas

回答

1

您的标准(ord(i) > 57344)检查,如果一个角色属于private use area是不正确的:

目前,3个私人使用区域被定义为:一个在基本多文种平面(U+E000–U+F8FF),每一个都在,a ND几乎涵盖,飞机15和16(U+F0000–U+FFFFDU+100000–U+10FFFD

这里是固定的Python 3代码:

pua_ranges = ((0xE000, 0xF8FF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD)) 

def is_pua_codepoint(c): 
    return any(a <= c <= b for (a,b) in pua_ranges) 

for line in open('test.txt', 'r'): 
    if any(is_pua_codepoint(ord(i)) for i in line): 
     pass 
    else: 
     print(line) 
+0

好的答案! – alvas

2

此grep命令将匹配U + E000中的任何不包含PUA字符的行, U + F8FF范围:

grep -Pv "[\xe0\x00-\xf8\xff]" 
+0

虽然这具体需要GNU'grep'。 Mac曾经有'grep -P'但它被删除。 – tripleee

+0

我使用的是GNU grep 2.25,但它对我不起作用 – Leon

+0

您可能还需要使用不同的语言环境,但我不确定。也许尝试'LC_ALL = POSIX'和/或'LC_ALL = C'? – tripleee

相关问题