如何从Unicode文件中删除字母数字单词

时间:2016-06-27 06:46:22

标签: python bash unicode awk sed

我需要使用字典数据库,但大多数是字母数字无用的东西,有趣的字段是非字母数字(如中文字符)或某些括号内。我搜索了很多,了解了许多工具,如sed,awk,grep等,我甚至考虑过创建一个Python脚本来解决它,但我从来没有设法找到解决方案。

数据库的一行如下所示:

助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist} 

我需要它像这样:

助 ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist} 

我可以使用上面提到的任何工具吗?

4 个答案:

答案 0 :(得分:1)

如果你仍然喜欢它,那么这是一个Python解决方案:

import re
alpha_brack = re.compile(r"([a-zA-Z0-9.\-]+)|({.*?})")

my_string = """
助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 
DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 
Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist}"""

match = alpha_brack.findall(my_string)

new_string = my_string

for g0, _ in match: # only care about first group!
    new_string = new_string.replace(g0,'',1) # replace only first occurence!

final = re.sub(r'\s{2,}',' ', new_string) # finally, clean up whitespace

print(final)

我的结果:

'助ジョたすけるたすかるすけるすけ{help} {rescue} {assist}'

答案 1 :(得分:0)

就个人而言,考虑到你的示例行,我会找出以空格开头和结尾的所有字母数字字符:

sed -i 's/ [a-zA-Z0-9 .-]+ / /g'应该接近你所需要的。如果您要删除的文本包含其他内容,则可能必须添加更多特殊字符。这是单个空格的原位替换(基本上是删除)。

没有linux盒可以验证这个...它可能需要一点点按摩。

另外值得一提的是,如果括号可以包含两个空格,则会有效:{test results found}因为它会吹掉results

答案 2 :(得分:0)

使用perl

perl -ne '
    m/(.*?)({.*)/; # Split based on '{'
    my $a=$1; my $b=$2;
    $a =~ s/[[:alnum:]-.]//g; #Remove alphabets, numbers, '.', '-' (add more characters as you need.)
    $a =~ s/ +/ /g; # Compress spaces.
    print "$a $b\n"; #Print 2 parts and a newline
' dbfile.txt

内联评论中的说明。

sed类似的逻辑:

sed '
     h; #Save line in hold space.
     s/{.*//; # Remove 2nd part
     s/[a-zA-Z0-9.-]//g; # Remove all alphabets, numbers, . & -
     s/  */ /g; # Compress spaces
     x; #Save updated 1st part in hold space, take back the complete line in pattern space
     s/[^{]*{/{/; #Remove first part
     x; #Swap hold & pattern space again.
     G; # Append 2nd part to first part separated by newline
     s/\n//; # Remove newline.
     ' dbfile.txt

答案 3 :(得分:0)

使用shell脚本(Bash):

#!/bin/bash

string="助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist}"

echo "" > tmpfield

for field in $string
do
    if [ "${field:0:1}" != "{" ];then               #
        echo $field|sed "s/[a-zA-Z0-9 .-]/ /g" >> tmpfield
    else
        echo $field >> tmpfield
    fi
done 

#convert rows to one column

 cat tmpfield | awk 'NF'|awk 'BEGIN { ORS = " " } { print }'

我的输出:

nampt@nampt-desktop:/mnt$ bash 1.bash 
  助 ジョ たす ける たす かる す ける すけ {help} {rescue} {assist}