繁体   English   中英

如何GREP单词,而不是包含特定字符的行,并打印整个单词

[英]How to GREP words, not lines, that contain specific characters, and print entire word

我有一个包含大量行和文字的文件,例如:

C742 C743 C744 C745 C835 C836 C837 C838 C839 C840 C841 C842 C843 C844 C845 C935 C936 C937 C938 C939 C940 C941 C942 C943 C944 C945 C1035 C1036 C1037 C1038 C1039 C1040 C1041 C1042 C1043 C1044 C1045 D135 D136 D137 D138 D139 D140 D141 D142 D143 D144 D145 D235 D236 D237 D238 D239 D240 D241 D242 D243 D244 D245 D335 D336 D337 D338 D339 D340 D341 D342 D343 D344 D345 D435 D436 D437 D438 D439 D440 D441 D442 D443 D444

我想要做的是仅列出包含特定数字的单词(假设每个4个字符包是一个单词),例如35

在这个例子中,我希望打印的结果是:

C835
C935
C1035
D135
D235
D335
D435

我尝试了几种不同的方法,比如使用grep只找到包含35的整行打印,或grep -o 35只打印35 ,我不知道该数字的前缀是什么。

尝试以下bash脚本:

cat words.txt | tr " " "\n" | grep 35

说明:

cat读取words.txt并将它们吐出到STDOUT,它被管道传输到tr ,这意味着“翻译”:在这种情况下,从空格(“”)到换行符(“\\ n”),然后, grep只是执行其默认行逐行行为并搜索包含35的任何内容。

尝试这个

for word in `cat filename`; do
    echo $word | grep 35
done

有一个标准的grep解决方案(\\ S用于非空白字符)

$ grep -o '\S*35\S*' words.txt
C835                                                                                                                  
C935                                                                                                                  
C1035                                                                                                                 
D135                                                                                                                  
D235                                                                                                                  
D335                                                                                                                  
D435  

您可以扩展正则表达式以匹配所有组,但它更麻烦:

grep -o "[^ ]*35[^ ]*" words.txt

上面的[^ ]*部分将匹配任何非空格字符。

蟒蛇:

import re
s = "C742 C743 C744 C745 C835 C836 C837 C838 C839 C840 C841 C842 C843 C844 C845 C935 C936 C937 C938 C939 C940 C941 C942 C943 C944 C945 C1035 C1036 C1037 C1038 C1039 C1040 C1041 C1042 C1043 C1044 C1045 D135 D136 D137 D138 D139 D140 D141 D142 D143 D144 D145 D235 D236 D237 D238 D239 D240 D241 D242 D243 D244 D245 D335 D336 D337 D338 D339 D340 D341 D342 D343 D344 D345 D435 D436 D437 D438 D439    D440 D441 D442 D443 D444"
print(re.findall(r'[A-Z0-9]*35[0-9]*',s)) # assuming '35' can appear anywhere in the number.

输出:

['C835', 'C935', 'C1035', 'D135', 'D235', 'D335', 'D435']

您可以使用以下内容读取整个文件:

with open('words.txt') as f:
    s = f.read()

如果您还使用Python来执行此操作:

>>> with open('file') as f:
...     print('\n'.join(i for i in f.read().split() if '35' in i))
...     
... 
C835
C935
C1035
D135
D235
D335
D435

这里, f.read()获取文件的内容并将内容作为字符串对象返回。 str.split()按空格分割字符串并返回一个列表。

但是, (i for i in f.read().split() if '35' in i)是Python中的生成器理解,它返回一个生成器,它只有元素中的'35' 所以我们可以使用它来获得期望输出(在这种情况下不需要正则表达式)。

最后,使用'\\n'.join()打印出来。 您也可以使用for循环:

>>> with open('file') as f:
...     for i in (i for i in f.read().split() if '35' in i):
...         print(i)
...         
...     
... 
C835
C935
C1035
D135
D235
D335
D435

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM