[英]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'
或者,讓xargs
對grep -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.