![](/img/trans.png)
[英]constructing regex to find lines not beginning with certain strings with grep in bash
[英]Grep for lines not beginning with “//”
我正在嘗試,但是沒有為grep編寫不以“ //”開頭的行的正則表達式(即C ++樣式的注釋)。 我知道“ grep -v”選項,但是我試圖學習如何僅使用正則表達式來實現這一點。 我已經搜索並找到了各種答案,這些技巧針對不以字符開頭的行進行grepping處理,甚至還針對如何針對不以字符串開頭的行進行grep處理,但我無法將這些答案適應我的要求的情況,我不明白我的錯誤是什么。
> cat bar.txt
hello
//world
> cat bar.txt | grep "(?!\/\/)"
-bash: !\/\/: event not found
我不確定此“找不到事件”的含義。 我找到的答案之一是使用paren-question-mark-exclamation-string-paren,我已經在這里完成了,但仍然失敗。
> cat bar.txt | grep "^[^\/\/].+"
(no output)
我發現的另一個答案是在方括號內使用插入符號,並解釋說此語法的意思是“搜索方括號(除插入符號之外)中沒有的內容。我認為“。+”表示“任何內容中的一個或多個”,但是我不確定這是正確的,還是正確的,它與“。*”的區別是什么?
簡而言之:如何構造正則表達式傳遞給grep來搜索不以“ //”開頭的行?
更具體地說,我正在嘗試搜索以“ //”開頭的具有“ #include”的行。
謝謝。
-P
選項 gnu-grep
。 !
在您的正則表達式中,否則將嘗試使用!
之后的文本擴展歷史記錄!
在您的正則表達式中, !\\/\\/: event not found
原因!\\/\\/: event not found
錯誤。 因此,您可以使用:
grep -P '^(?!\h*//)' file
hello
\\h
匹配0個或多個水平空白。
如果沒有-P
或非gnu grep,則可以使用grep -v
:
grep -v '^[[:blank:]]*//' file
hello
要查找沒有//
(或/*
…) #include
行,可以使用:
grep '^[[:space:]]*#[[:space:]]*include[[:space:]]*["<]'
正則表達式會查找行首,可選空格, #
,可選空格, include
,可選空格以及"
或<
。它將查找除#include MACRO_NAME
類的行之外的所有#include
行,這些行是合法的但很少見,並且有螺絲#include MACRO_NAME
如:
#/*comment*/include/*comment*/<stdio.h>
#\
include\
<stdio.h>
如果您必須處理包含此類符號的軟件,則(a)我表示同情,並且(b)在#include
行之前將代碼固定為更正統的風格。 它將收到諸如以下的誤報:
/* Do not include this:
#include <does-not-exist.h>
*/
您可以以最小的混淆機會省略最后的[[:space:]]*["<]
,然后選擇宏名稱變體。
要查找不以雙斜杠開頭的行,請使用-v
(反轉匹配)和'^//'
在行首查找斜杠:
grep -v '^//'
第一行告訴您問題出在bash
(您的shell)。 Bash找到了!
並嘗試將您最后輸入的以\\/\\/
開頭的命令注入到命令中。 為了避免這種情況,您需要逃脫!
或使用單引號。 舉一個例子!
,嘗試!cat
,它將執行以您輸入的cat
開頭的最后一個命令。
您不需要轉義/
,它在正則表達式中沒有特殊含義。 您也不需要編寫復雜的正則表達式來反轉匹配。 相反,只需為grep提供-v
參數即可。 大多數情況下,簡單會更好。 而且您也不需要將文件保存為grep。 只需為grep提供文件名即可。 例如。
grep -v "^//" bar.txt | grep "#include"
如果您真的想使用正則表達式,那么可以使用一個簡單的表達式(匹配字符串^
開始,任意數量的空格[[:space:]]*
,正好兩個反斜杠/{2}
,任意數量的任意字符.*
,后跟#include
):
grep -E "^[[:space:]]*/{2}.*#include" bar.txt
您必須使用-P
(perl)選項:
cat bar.txt | grep -P '(?!//)'
對於不是以“ //”開頭的行,可以使用(^[^/]{2}.*$)
。
如果您不喜歡grep -v
,則可以使用awk:
awk '!/^\/\//' file
由於awk不僅支持正則表達式,還支持復合條件,因此與grep相比,指定要與awk匹配的內容通常更容易,例如,使用grep以任意順序搜索a
和b
:
grep -E 'a.*b|b.*a`
當使用awk時:
awk '/a/ && /b/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.