2015-06-28 57 views
2

我想知道是否有可能從非格式化字符串獲得grep -P(linux bash)命名正則表達式?以及..從任何字符串是否有任何命名正則表達式捕獲的grep?

例如: John Smith www.website.com [email protected] jan-01-2001 拍攝爲

$name 
$website 
$email 
$date 

但似乎我不能傳遞任何變量從輸出?

echo "www.website.com" | grep -Po '^(www\.)?(?<domain>.+)$' | echo $domain

沒有輸出

+0

做'域= $(回聲Website.com | grep的-Po ...'); echo $ domain'。祝你好運。 – shellter

+1

沒有。 'grep'是一個過程。你正在談論從小孩到父母的環境傳播。這是禁止的。相反,你可以做'DATA =($ your_line)',然後'name = DATA [0]'來回。 – HuStmpHrrr

回答

4

沒有。 grep是一個過程。你正在談論從小孩到父母的環境傳播。這是禁止的。

相反,你可以做

DATA=($your_line) 

然後採取name=DATA[0]如此往復。

或用awk另一種方式:

eval "`echo $your_line | awk ' 
    function escape(s) 
    { 
     gsub(/'\''/,"'\''\"'\''\"'\''", s); 
     s = "'\''"s"'\''"; 
     return s; 
    } 
    { 
     print "name="escape($1); 
     print "family_name="escape($2); 
     print "website="escape($3); 
     print "email="escape($4); 
     print "date="escape($5); 
    }'`" 

這裏的感覺是通過標準輸出來傳播信息,並在父環境EVAL它。

注意,在這裏,轉義函數會正確地轉義任何字符串,以至於任何東西都不會被錯誤地解釋(如引號的邪惡)。

以下是我的傑西輸出:

name='John' 
family_name='Smith' 
website='www.website.com' 
email='[email protected]' 
date='jan-01-2001' 

如果姓O'Reilly中,eval結果仍然是正確的:

name='John' 
family_name='O'"'"'Reilly' 
website='www.website.com' 
email='[email protected]' 
date='jan-01-2001' 
+0

如何在這裏使用正則表達式?我需要確保值符合模式。有沒有辦法?或者我必須對每個變量運行額外的檢查?例如在下一個字符串'網站'丟失,然後轉義($ 3)變成電子郵件,而不是網站 – Shirker

+1

@Shirker哦是的。情況就是這樣,如果你的輸入數據不穩定,事情就會變得複雜。這是你可以做的一個簡短的例子。基本上這個想法是打印值爲標準輸出,然後評估。如果有可能缺少一個字段或其他問題,最好使用python來應用更具體的處理。但程序與我的沒有太大的不同。 – HuStmpHrrr

+0

是的,我認爲用python會很容易。時間開始學習它 – Shirker

3

grep的是一個獨立的命令行實用程序;它不會在bash中運行。所以它不能創建bash變量,即使它想要。

但是,bash有一個內置的正則表達式匹配器。它不是perl兼容的正則表達式匹配器,所以它不實現命名捕獲。 (準確地說,它匹配Posix擴展正則表達式,與grep -E相同。)但它確實實現了編號的捕獲。

您在[[ ... ]]化合物命令語法中與=~運算符進行了正則表達式匹配。如果正則表達式匹配,則表達式成功,並將捕獲插入到數組變量BASH_REMATCH中。 ${BASH_REMATCH[0]}將是整個匹配的子字符串,並且其餘的元素(從${BASH_REMATCH[1]}開始)將按順序被單獨捕獲。

例如:

$ url=www.example.com 
$ [[ $url =~ ^(www\.)?(.*) ]] 
$ echo "${BASH_REMATCH[1]}" 
www. 
$ echo "${BASH_REMATCH[2]}" 
example.com 
+0

有沒有可以分配數字的方法?例如'$ {BASH_REMATCH [1]}'將永遠匹配?([Az] {1,} [Az] {1,})和'$ {BASH_REMATCH [2]}'將永遠是?(www \。) (。*)甚至這些都放錯了位置?或者我應該考慮使用Perl呢? – Shirker