簡體   English   中英

Grep表示不以“ //”開頭的行

[英]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”的行。

謝謝。

  1. 您正在使用負前瞻功能,這是PCRE功能,需要-P選項
  2. 沒有開始錨定,您的否定前瞻將不起作用
  3. 當然,這將需要gnu-grep
  4. 您必須使用單引號來使用! 在您的正則表達式中,否則將嘗試使用!之后的文本擴展歷史記錄! 在您的正則表達式中, !\\/\\/: 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以任意順序搜索ab

grep -E 'a.*b|b.*a`

當使用awk時:

awk '/a/ && /b/'

暫無
暫無

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

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