1

一致するものが見つかった場合にテキスト行を返す方法を理解するのに問題があります。

(set 'wireshark "http://anonsvn.wireshark.org/wireshark/trunk/manuf")

(set 'arptable (map (fn (x) (parse x " ")) (exec "arp -a")))

(define (cleanIPaddress x)
  (slice x 1 -1))

(define (cleanMACaddress x) 
  (upper-case (join (slice (parse x ":") 0 3) ":")))

(define (addIPandMACaddress x) 
  (list (cleanIPaddress (nth 1 x)) (cleanMACaddress (nth 3 x))))

(set 'arplist (map addIPandMACaddress arptable))

(set 'routerMAC (last (assoc (exec "ipconfig getoption en1 router") arplist)))

(find-all routerMAC (get-url wireshark))

戻り値

("20:AA:4B")

だから私はコードが「機能する」ことを知っています

しかし、私はテキストの全行を取得したい

"20:AA:4B Cisco-Li # Cisco-Linksys, LLC"

4

2 に答える 2

2

これは、(Common Lispバージョンの)を使用して改行で分割された文字列を検索し、検索している文字列を含まない行を削除するstring-split手順を使用するだけで実行できます。その結果、文字列を含むすべての行のリストが作成されます。ここで定義する関数は、さまざまなCommon Lispライブラリを介してすでに利用可能ですが、教育目的で、すべて自分で定義します。必要なコードは次のように機能します。remove-iffilter

; First we need a function to split a string by character

(defun string-split (split-string string)
  (loop with l = (length split-string)
        for n = 0 then (+ pos l)
        for pos = (search split-string string :start2 n)
        if pos collect (subseq string n pos)
        else collect (subseq string n)
        while pos))

; Now we will make a function based on string-split to split by newlines

(defun newline-split (string)
  (string-split "
" string))

; Finally, we go through our text searching for lines that match our string.
; Make sure to replace 'needle' with the string you wish to search for.

(remove-if #'(lambda (x) 
               (equal 'nil (search (string-upcase "needle") 
                                   (string-upcase x))))
           (newline-split haystack))

いくつかの小さな変更を加えるだけで、この戦略を投稿したコードに適用できるはずです。このコードは、Mac OSX10.7.5上のANSICommonLispの実装であるSBCL1.0.55.0-abb03f9でテストされました。

于 2012-11-24T06:37:36.170 に答える
1

最後に私は使用しました:

(find-all (string routerMAC ".*") (get-url wireshark))
于 2012-11-25T22:59:45.643 に答える