2017-02-21 12 views
0

正規表現で未知の部分文字列を取得するにはどうすればよいですか?私は望む文字列の前後に何があるのか​​知っていますが、結果には既知の部分は望んでいません。RegExで未知の部分文字列を一致させる

例のテキスト:

jhgjgjgvocher_SOMETHINGHERE.dbhjjkghjkg 
vocher_SOMETHINGELSE.db 

私は 'SOMETHINGHERE' と 'SOMETHINGELSE' だけを探しています。

vocher_および.dbは、常に関連する部分の前後にありますが、結果には含まれません。

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

...しかし、あなたはそれが醜いことを知っている:

ワーキングソリューションです。

正規表現(この場合は.*部分のみ)で未知の部分を正確に検索することは可能ですか、それともsedのようなものを使用する必要がありますか?より良い解決策はありますか?この反復行ずつファイル上

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

と所望の部分のみを印刷する:Perlを使用して

+4

「grep -oP」(?<= vocher _)。*?(?= \。db)で置き換えてみてください。 " –

+0

@Wiktor:そうですが、いいえアスタリスクの後に疑問符が必要です。 – JosefScript

+0

も参照してください。[SO docのLookaheadとLookbehindの例](https://stackoverflow.com/documentation/regex/639/lookahead-and-lookbehind#t=201702220503256206195) – Sundeep

答えて

0

使用次のgrepアプローチ:

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

-Pは - Perlの正規表現を可能に

-o - 版画だけマッチした部分文字列

出力は以下のようになります

SOMETHINGHERE 
SOMETHINGELSE 
+0

この解決策の問題は、彼の問題でOPが持っている追加情報を悪用しないということです。彼は 'voucher_'を目的のテキストの前に置くことを望み、ファイルは' .db'でなければなりません。このコードを使用した場合は、他の条件を満たすかどうかにかかわらず、アンダースコアの後にすべてを取得します。 – ahjohnston25

+1

@ ahjohnston25、もう一度質問を読んで解決策を修正しました。 – RomanPerekhrest

関連する問題