2017-02-21 43 views
0

如何獲得具有正則表達式的未知子串?我知道想要的字符串前後是什麼,但我不想在結果中使用已知的部分。將未知子串與正則表達式匹配

示例文本:

jhgjgjgvocher_SOMETHINGHERE.dbhjjkghjkg 
vocher_SOMETHINGELSE.db 

我在尋找 'SOMETHINGHERE',只有 'SOMETHINGELSE'。

vocher_.db總是在相關部分之前和之後,但不應該在結果中。

的工作方案是:

cat test | egrep -o "vocher_.*\.db" | cut -d "_" -f2 | cut -d "." -f1 

...但你知道它是醜陋的。

是否有可能正確地搜索正則表達式的未知部分(在這種情況下只有.*部分),還是我需要使用類似sed的東西?有更好的解決方案嗎?

+4

嘗試用'grep -oP「(?<= vocher _)。*?(?= \。db)替換'egrep -o」vocher _。* \。db「'」' –

+0

@Wiktor:需要星號後面的問號。 – JosefScript

+0

另請參見[在SO文檔上的前瞻和Lookbehind示例](https://stackoverflow.com/documentation/regex/639/lookahead-and-lookbehind#t=201702220503256206195) – Sundeep

回答

1

用perl一個簡單的解決方案是:

perl -ne 'if (/vocher_(.*)\.db/){ print "$1\n";}' test_file.txt 

此迭代線由行過該文件並只打印期望部分。

0

使用以下的grep方法:

grep -Po '(?<=vocher_).+(?=\.db)' test 

-P - 允許Perl的正則表達式

-o - 只打印匹配的子

輸出會像下面:

SOMETHINGHERE 
SOMETHINGELSE 
+0

該解決方案的問題在於,它不會利用OP在其問題中提供的附加信息。他希望'voucher_'在所需文本前面,文件應該是'.db'。如果您使用此代碼,則無論是否符合其他條件,您都會在下劃線後獲得所有內容。 – ahjohnston25

+1

@ ahjohnston25,我再次閱讀了這個問題並修復了我的解決方案,現在沒關係 – RomanPerekhrest