2012-11-23 61 views
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"

+0

Wireshark的项目从Subversion在2014年一月切换到Git中“厂商” URL现在是https://code.wireshark.org/review/gitweb?p = wireshark.git; a = blob_plain; f = manuf –

回答

1

在我使用的结尾:

(find-all (string routerMAC ".*") (get-url wireshark)) 
1

的这可以通过usi简单地执行ng string-split过程允许我们使用remove-if(通用Lisp版本filter)搜索由换行符分隔的字符串,删除不包含我们正在搜索的字符串的所有行。这将导致包含该字符串的每一行的列表。我们在这里定义的函数已经可以通过各种Common Lisp库获得,但为了教育目的,我们将自己定义它们。你所需要的代码工作像这样:

; 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 OS X 10.7.5上的ANSI Common Lisp实现SBCL 1.0.55.0-abb03f9上进行了测试。

+0

感谢您的解释。 – beoliver

相关问题