2011-03-21 102 views
2

我想匹配一個正則表達式,其字符串一部分包含在一個變量中:的grep一個字符串變量和正則表達式

matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt` 

在正則表達式,將意味着「在任何phonelist.txt線它以命令行參數開頭,後跟一個空格和一個任意數字的數字「。已經嘗試了很多東西,但似乎無法得到它。 幫助

回答

1

我想你應該嘗試:

IFS=" " 
matches=$(grep "^$* [0-9]\+" --count phonelist.txt) 

bash的手冊頁說:$*「擴展爲一個詞與分離的每一個參數的值通過IFS特殊變量的第一個字符「[email protected]」,每個參數擴展爲一個單獨的單詞,即「[email protected]」相當於「$ 1」「$ 2」...「。 在您的正則表達式中,您將需要將所有參數合併爲一個單詞。

+0

謝謝 - 將它檢查回家 - 不幸的是我的遠程外殼說IFS:未定義的變量,但會檢查這一點 - 編輯:是tsch。 – 2011-03-21 21:42:00

+0

爲什麼'IFS =「」'部分? – 2011-03-21 22:29:24

+0

在'bash'(我預計會使用它)控制'$ *'的擴展中'IFS =「」'是必需的。這意味着'$ *'的所有元素都被連接成一個字符串,用「」分隔。 「IFS」表示「內部字段分隔符」。 – bmk 2011-03-22 10:02:46

2

這給一試:

matches=$(grep "^$* [0-9]\+" --count phonelist.txt) 
+0

給出了'grep:iygfiyhgv [0-9] \ +:當用參數調用時沒有這樣的文件或目錄':iygfiyhgv。 – 2011-03-21 03:39:05

+0

@Mr_and_Mrs_D:這是其中需要'$ *'而不是'$ @'的實例之一。對困惑感到抱歉。請嘗試修改後的版本。 – 2011-03-21 10:22:56

+0

''grep --count'^ $ * [0-9] \ +「phonelist.txt''我用 - 似乎工作(會測試更多)。 – 2011-03-21 22:26:47

2

如果你要正確對待每個命令行參數作爲一個單獨的模式(即你希望有一個「匹配」,如果符合的命令行參數的任何開始),那麼你可以構建這樣你整個擴展正則表達式:

^(arg1|arg2|arg3|...) [0-9]+ 

您可以使用set IFS來|和使用$*自動擴展您的位置參數到這種形式是這樣的:

(IFS=\|; echo "^($*) [0-9]+") 

霸租借形式爲子外殼,以便更改後的IFS僅限於括號中的命令(您可能不希望該設置影響腳本的後續部分。

使用包含擴展正則表達式元字符的命令行參數時需要小心。例如,如果要搜索字符串foo(bar),則需要傳遞一些信息,如foo\(bar\)作爲參數(與字符串匹配的ERE),您可以在實際命令行上將其寫爲'foo\(bar\)'

最後,把它放回原來的命令,並告訴grep期望擴展正則表達式(-E):

matches=$(IFS=\|; grep -E "^($*) [0-9]+" --count phonelist.txt) 

命令替換$()實際上是它自己的子shell,所以修改後的IFS值不會「轉義」到腳本的後面部分。

+0

會在我回家後回來檢查它 - 我確實需要所有參數(它們將在電話列表中形成名稱,可以是_john_或_wolfgang amadeus mozart_的任意長/短) – 2011-03-21 10:18:46

+0

如果您計劃傳遞個人姓名組件作爲單獨的參數,那麼你會希望其他答案顯示的方法(只是'$ *'而不是'IFS = \ |'和'($ *)')。我的答案是,如果你想寫'腳本'wolfgang amadeus mozart''johann sebastian bach''(引用多詞的名稱,所以他們進入單一的參數和多個參數提供替代字符串(模式,真的)匹配) 。 – 2011-03-21 11:09:44