我想匹配一個正則表達式,其字符串一部分包含在一個變量中:的grep一個字符串變量和正則表達式
matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`
在正則表達式,將意味着「在任何phonelist.txt線它以命令行參數開頭,後跟一個空格和一個任意數字的數字「。已經嘗試了很多東西,但似乎無法得到它。 幫助
我想匹配一個正則表達式,其字符串一部分包含在一個變量中:的grep一個字符串變量和正則表達式
matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`
在正則表達式,將意味着「在任何phonelist.txt線它以命令行參數開頭,後跟一個空格和一個任意數字的數字「。已經嘗試了很多東西,但似乎無法得到它。 幫助
我想你應該嘗試:
IFS=" "
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)
bash的手冊頁說:$*
「擴展爲一個詞與分離的每一個參數的值通過IFS
特殊變量的第一個字符「[email protected]
」,每個參數擴展爲一個單獨的單詞,即「[email protected]
」相當於「$ 1」「$ 2」...「。 在您的正則表達式中,您將需要將所有參數合併爲一個單詞。
這給一試:
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)
給出了'grep:iygfiyhgv [0-9] \ +:當用參數調用時沒有這樣的文件或目錄':iygfiyhgv。 – 2011-03-21 03:39:05
@Mr_and_Mrs_D:這是其中需要'$ *'而不是'$ @'的實例之一。對困惑感到抱歉。請嘗試修改後的版本。 – 2011-03-21 10:22:56
''grep --count'^ $ * [0-9] \ +「phonelist.txt''我用 - 似乎工作(會測試更多)。 – 2011-03-21 22:26:47
如果你要正確對待每個命令行參數作爲一個單獨的模式(即你希望有一個「匹配」,如果符合的命令行參數的任何開始),那麼你可以構建這樣你整個擴展正則表達式:
^(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值不會「轉義」到腳本的後面部分。
會在我回家後回來檢查它 - 我確實需要所有參數(它們將在電話列表中形成名稱,可以是_john_或_wolfgang amadeus mozart_的任意長/短) – 2011-03-21 10:18:46
如果您計劃傳遞個人姓名組件作爲單獨的參數,那麼你會希望其他答案顯示的方法(只是'$ *'而不是'IFS = \ |'和'($ *)')。我的答案是,如果你想寫'腳本'wolfgang amadeus mozart''johann sebastian bach''(引用多詞的名稱,所以他們進入單一的參數和多個參數提供替代字符串(模式,真的)匹配) 。 – 2011-03-21 11:09:44
謝謝 - 將它檢查回家 - 不幸的是我的遠程外殼說IFS:未定義的變量,但會檢查這一點 - 編輯:是tsch。 – 2011-03-21 21:42:00
爲什麼'IFS =「」'部分? – 2011-03-21 22:29:24
在'bash'(我預計會使用它)控制'$ *'的擴展中'IFS =「」'是必需的。這意味着'$ *'的所有元素都被連接成一個字符串,用「」分隔。 「IFS」表示「內部字段分隔符」。 – bmk 2011-03-22 10:02:46