簡體   English   中英

查找在其他行上的其他兩個字符串之間的所有字符串實例

[英]Find all instances of string between two other strings that are on other lines

所以我覺得我應該知道該怎么做,但我做不到。

我正在嘗試查找所有實例(在所有文件中),其中兩個字符串之間(通常在其他行上)@GROUP和@END_GROUP中存在以_START結尾的字符串

所以可能會有這樣的代碼

// @GROUP GroupName OtherStuff
#define GROUPNAME_START 1
#define GROUPNAME_FOO 2
.... (more defines)
#define GROUPNAME_END 10
// @END_GROUP

#define GROUPTWO_START 1
// @GROUP GroupTwo MoreStuff
#define GROUPTWO_FOO 2
.... (some defines)
#define GROUPTWO_BAR 70
// @END_GROUP

我想匹配第一個組(實際上只匹配_START行,但一切正常),但不匹配第二個組或@GROUP注釋之外的_START行。

我認為為此使用grep將是搜索所有文件的最佳方法,但是我不能完全獲得所需的正則表達式。 謝謝您的幫助。

編輯:我的缺點是無法明確表示我希望能夠同時搜索多個目錄中的文件,就像grep -r“ foo” *一樣。 答案很好,我只是沒有說清楚。

edit2:多個很好的答案每個都以略有不同的方式解決了它,我真的不知道哪個是最好的。 我標記了第一個回答的人,但是任何關注此問題的人都應該確保檢查出所有答案,一個可能會更好地解決您的問題。

grep只看到一行,因此它不知道它是否在組注釋之間。 sed可以使用地址,但是:

sed '/@GROUP/,/@END_GROUP/!d' input_file | grep '_START'

! 取反地址, d刪除一行,即我們告訴sed刪除不在組注釋之間的行。 然后grep僅在“有趣”行上運行。

要使其也適用於子目錄,請在工具箱中添加find

find /path/to/dir -type f -exec sed '/@GROUP/,/@END_GROUP/!d' {} + | grep '_START'

或者,如果組注釋可能沒有相應的END出現,請使用較慢但更安全的方法

find /path/to/dir -type f -exec sed '/@GROUP/,/@END_GROUP/!d' {} \; | grep '_START'

或者,讓xargsgrep -l的輸出進行操作:

grep -lr @GROUP /path/to/dir | xargs sed '/@GROUP/,/@END_GROUP/!d' | grep '_START'

注意:如果文件名包含空格,則無法使用。

使用awk您可以使用空RS並在單個搜索中完成所有操作:

awk -v RS= '/@GROUP.*_START.*@END_GROUP/' file
// @GROUP GroupName OtherStuff
#define GROUPNAME_START 1
#define GROUPNAME_FOO 2
.... (more defines)
#define GROUPNAME_END 10
// @END_GROUP

這是sed的工作,使用其地址語法:

#!/bin/sed -f

/@GROUP/h  # store the @GROUP line

/@GROUP/,/@END_GROUP/{
/_START/{
g  # retrieve the @GROUP line
n  # print it and continue
}
}

# otherwise, delete the line and continue
d

嵌套的塊有點復雜,但是它的作用是:在@GROUP .. @END_GROUP ,然后對於匹配_START任何行,它將打印先前找到的@GROUP行(因此,使用您的示例):

$ ./group.sed group.data 
// @GROUP GroupName OtherStuff

這就是您要達到的目標嗎?

編輯 :這不是您要的-您只需要_START行,而不是@GROUP行。 嗯,這要容易得多:

#!/bin/sed -nf
/@GROUP/,/@END_GROUP/{
/_START/p
}

附錄 :由於您現在要求遞歸目錄搜索,因此可以按照其他答案中的描述使用find

find . -type f -print0 | xargs -0 ./group.sed --separate

(我在這里使用了GNU sed --separate參數來防止任何文件以組開頭但缺少組結束行)。

暫無
暫無

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

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