出力ファイルを含む複数のサブフォルダ(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=(.*?)\\'