簡體   English   中英

grep 和 regex 存儲在字符串中

[英]grep and regex stored in string

我的問題很短:

a="'[0-9]*'"
grep -E '[0-9]*' #for example, line containing 000 will be recognized and printed

grep -E $a #line containing 000 WILL NOT be printed, why is that?

替換 grep regex 是否會改變命令的行為,還是從句法的角度來看我錯過了什么? 換句話說,我如何才能讓 grep 接受來自存儲在變量中的字符串的正則表達式。

先感謝您。

行情繞過去的數據,而不是數據。 這意味着,當您將數據(在本例中為正則表達式)存儲在變量中時,不要在變量中嵌入引號; 相反,在使用變量時在變量周圍加上雙引號:

a="[0-9]*"
grep -E "$a"

有時您可以在使用變量時去掉雙引號(如 Avinash Raj 的評論),但這通常並不安全。 在這種情況下,只要當前工作目錄中沒有名稱恰好以數字開頭的文件或子目錄,它就會正常工作。 你看,如果沒有$a周圍的雙引號,shell 將取其值,嘗試將其拆分為多個單詞(這里不是問題),嘗試將包含 shell 通配符的每個單詞擴展為匹配文件列表(潛在問題)這里),並傳遞到命令( grep )作為它的參數列表。 這意味着如果您碰巧在當前目錄中有以數字開頭的文件, grep認為您運行了如下命令:

grep -E 1file.txt 2file.jpg 3file.etc

...並將第一個文件名視為要搜索的模式,將任何其他文件名視為要搜索的文件。 你會撓頭想知道為什么你的腳本工作或失敗取決於你碰巧在哪個目錄中。

注意:模式[0-9]*是一個有效的正則表達式,也是一個有效的 shell glob(通配符)模式,但它在兩種上下文中的含義非常不同。 作為正則表達式,它意味着一行中的 0 個或多個數字。 作為一個 shell glob,它意味着以數字開頭的東西。 說到這一點, grep -E '[0-9]*'實際上並不是很有用,因為所有內容都包含 0 個或多個數字的字符串,因此它會匹配您提供給它的每個文件的每一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM