Skip to main content
 首页 » 编程设计

python之从文件中提取单词,然后列出文件以及包含这些单词的行号

2025年05月04日19myhome

我有一个名为 Strings.h 的文件,我用它来本地化我的应用程序。我想搜索我所有的类文件,找出我是否使用每个字符串以及在何处使用每个字符串,然后输出每个字符串的类和行号。

我的想法是使用 Python,但也许这是不适合这项工作的工具。另外,我有一个基本算法,但我担心运行时间会太长。你能写这个脚本来做我想做的事,或者只是建议一个更好的算法吗?

Strings.h 看起来像这样:

#import "NonLocalizedStrings.h" 
 
#pragma mark Coordinate Behavior Strings 
#define LATITUDE_WORD NSLocalizedString(@"Latitude", @"used in coordinate behaviors") 
#define LONGITUDE_WORD NSLocalizedString(@"Longitude", @"used in coordinate behaviors") 
#define DEGREES_WORD NSLocalizedString(@"Degrees", @"used in coordinate behaviors") 
#define MINUTES_WORD NSLocalizedString(@"Minutes", @"Used in coordiante behaviors") 
#define SECONDS_WORD NSLocalizedString(@"Seconds", @"Used in DMSBehavior.m") 
 
... 

脚本应该获取以#define 开头的每一行,然后列出出现在#define 之后的单词(例如)LATITUDE_WORD

伪代码可能是:

file = strings.h 
for line in file: 
  extract word after #define 
  search_words.push(word)  
 
print search_words 
[LATITUDE_WORD, LONGITUDE_WORD, DEGREES_WORD, MINUTES_WORD, SECONDS WORD] 

在我得到单词列表后,我的伪代码是这样的:

found_words = {} 
for word in words: 
   found_words[word] = [] 
 
for file in files: 
  for line in file: 
    for word in search_words: 
      if line contains word: 
        found_words[word].push((filename, linenumber))    
 
print found_words 

所以,找到的单词看起来像这样:

 { 
   LATITUDE_WORD: [ 
                    (foo.m, 42), 
                    (bar.m, 132)  
                  ], 
   LONGITUDE_WORD: [ 
                    (baz.m, 22), 
                    (bim.m, 112)  
                  ], 
 
 } 

请您参考如下方法:

这个[在 bash 中]怎么样?

$ pattern="\\<($(grep '^#define ' Strings.h | cut -d' ' -f2 | tr '\n' '|' | sed 's/|$//'))\\>" 
$ find project_dir -iname '*.m' -exec egrep -Hno "${pattern}" {} + > matches 

输出:

project_dir/bar.m:132:LATITUDE_WORD 
project_dir/baz.m:22:LONGITUDE_WORD 
project_dir/bim.m:112:LONGITUDE_WORD 
project_dir/foo.m:42:LATITUDE_WORD 

编辑:我更改了上面的代码以将其输出重定向到文件matches,因此我们可以使用它来显示从未找到的单词:

for word in $(grep '^#define ' Strings.h | cut -d' ' -f2) 
do 
    if ! cut -d':' -f3 matches | grep -q "${word}" 
    then 
        echo "${word}" 
    fi 
done