我需要使用字典数据库,但大多数是字母数字无用的东西,有趣的字段是非字母数字(如中文字符)或某些括号内。我搜索了很多,了解了许多工具,如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}
我可以使用上面提到的任何工具吗?
答案 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}