2009-06-09 14 views
0

現在のディレクトリ内のすべてのファイルで属性(文字列)を検索し、ファイル名と共に属性値を格納するシェルスクリプトを探します。属性とストア値をファイル名と共に検索するシェルスクリプト

例えばFILE1.TXT

のABC XYZ = "PQR"

FILE2.TXTは

ABC xyzが=ここ

はFile1とFile2のが目的の文字列 "ABCのXYZ" を含む "KLM"値「pqr」および「klm」を有する。 FILE1.TXT: FILE2.TXT PQR:KLM

答えて

0

このためにはbashスクリプトを使用しないでください 私はこのような何かを発生します。

コードには少し改善の余地がありますが、
ですが、20行ではその仕事をしています。

注:このコードでは、行の先頭に「abc xyz」があることを前提としています。その膨大な知識を共有するためのDavid BeazleyA.M. Kuchling、およびMark Pilgrim

#!/usr/bin/python 

import os 
import re 

MYDIR = '/dir/you/want/to/search' 

def search_file(fn): 
    myregex = re.compile(r'abc xyz = \"([a-z]+)\"') 
    f = open(fn, 'r') 
    for line in f: 
     m = myregex.match(line) 
     if m: 
      yield m.group(1) 

for filename in os.listdir(MYDIR): 
    if os.path.isfile(os.path.join(MYDIR, filename)): 
     matches = search_file(os.path.join(MYDIR, filename)) 
     for match in matches: 
      print filename + ':' + match, 

感謝。
あなたの道を導く人がいなければ、このようなことはできませんでした。

1

これは、どのように 'シェルスクリプト'を定義するかによって異なります。

  • はgrep/sedの使い方::ここでは3一行のソリューションです。

    egrepの-o "のABC XYZ =は" * "'* | sedの-eさん/ ABC XYZ ="(。 *) "/ \ 1/'

  • 使用AWK:

    AWK'/ABC XYZ = "()"/ {印刷FILENAME ":" gensub( "ABCのXYZ = \"( )\ ""、\ 1 "、1)} '*

  • 使用Perlのワンライナー:

    のperl -ne 'IF(S/ABC XYZ = "(*)。"/$ ARGV:$ 1 /){プリント} *

私が個人的に希望最後のものと一緒に行く。

+0

@abbot:あなたの答えははるかに優れています。私の仕事では、スクリプトを再利用して拡張する傾向があります。 Pythonは理想的です。しかし、これは一回限りの仕事のようです。簡潔な1ライナーの功績。あなたが私の答えを削除すべきだと思ったら教えてください。 – bernie

+0

削除する必要はありません。しかし、pythonのバージョンはもっとコンパクトにできます。http://gist.github.com/126323 – abbot

+0

かなりの圧縮率があります!その宝石を共有してくれてありがとう。 – bernie

関連する問題