一致するパターンに続く行部分のみを返す(Unix)

一致するパターンに続く行部分のみを返す(Unix)

出力ファイルを含む複数のサブフォルダ(1、2、3....25)を含む親フォルダ(abeps)があり、そのうちの1つは同じ名前(opt.out)を持ちます。このファイルには予測不能な出力があります。以下は、フィルタリングする必要がある行の例です。

A\HF=-1378.9118397\RMSD=4.560e-09\RMSF=1.758e-05\dipole=0.2110167,0.39

または

978,3.8529967641,3.6669041122\version=ES64L-G09RevD.01\status=1-A\HF=-

それで、質問は\ HF =から最大\までのすべてを得ることに興味があるということです。

しかし、彼らは別のラインにあっても、HFも別のラインにある可能性があるため、grepはそれを捕捉できません。その後、結果をファイルに書き込もうとします。

grep 'HF=-' abeps/*/opt.out > data

その結果、このように出ました。

abeps/10/opt.out: 1-A\HF=-1378.9114895\RMSD=5.126e-09\RMSF=5.036

abeps/12/opt.out: \State=1-A\HF=-1378.9185518\RMSD=2.940e-09\RMSF

abeps/13/opt.out: 33413\version=ES64L-G09RevD.01\status=1-A\HF=-137

答え1

grepバージョンがPCRE(Perl Compatible Regular Expressions)をサポートしている場合は、Perlの振り返りとプレビュー機能を使用できます。

grep -oPz '(?<=\\HF=)(.|\n)+?(?=\\)'

またはpcregrep(存在する場合)と

pcregrep -Mo '(?<=\\HF=)(.|\n)+?(?=\\)'

興味のあるパターンが実際に行分割である場合は、返されたテキストに改行が保持されることに注意してください。tr結果を使用するときや使用する前にそれらを削除することをお勧めします。sed

テキスト自体を行に分割できない場合(\HFおよびタグのみ)、より単純な行に置き換える\ことができます。(.|\n)+?.+?

grep -oPz '(?<=\\HF=).+?(?=\\)'

\HF=元の投稿に対するあなたの意見からわかるように、ある時点でトークンが改行に分割される可能性がある場合、PCREは現在の可変長の振り返りをサポートしていないため、少し異なるアプローチが必要です。この場合、試してみることができます

grep -oPz '\\\n?H\n?F\n?=\K(.|\n)+?(?=\\)'

ここで、Lookbehindは次のように擬似アンカー式に置き換えられます。\K

答え2

また、使用することができますsed

sed -r '/.*HF=([^\]*)\\?.*/s//\1/g' file

例:

$ echo 'A\HF=-1378.9118397\RMSD=4.560e-09\RMSF=1.758e-05\Dipole=0.2110167,0.39' | sed -r '/.*HF=([^\]*)\\?.*/s//\1/g'
-1378.9118397

$ echo '978,3.8529967641,3.6669041122\Version=ES64L-G09RevD.01\State=1-A\HF=-' | sed -r '/.*HF=([^\]*)\\?.*/s//\1/g'
-

答え3

最近pcregrep:

pcregrep -Mo1 '(?s)\\HF=(.*?)\\'

関連情報