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

时间:2016-01-04 03:56:54

标签: python regex linux bash ubuntu

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

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并且我这样做不知道那个号码的前缀是什么。

6 个答案:

答案 0 :(得分:4)

尝试以下bash脚本:

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

说明:

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

答案 1 :(得分:2)

试试这个

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

的Python:

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()

答案 5 :(得分:0)

如果您也使用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