文字列から数字と記号の組み合わせを削除するには、${VARNAME//pattern/} を使用します。

文字列から数字と記号の組み合わせを削除するには、${VARNAME//pattern/} を使用します。

2つの異なる実行可能ファイルを使用してvalgrindの出力を比較するスクリプトを作成しようとしていますが、各行の先頭にあるプロセスIDはdiff出力を混乱させています。 bashコマンドを使用して削除しようとしても成功できないようです。

これは私のコードです。

VG_MY=$((valgrind --leak-check=full ./executable < inputfile) 2>&1)
VG_MY=${VG_MY//[0-9]/}

これにより、次のようにVG_MYのすべての数字が削除されます。

VG_MY="${VG_MY//[[:digit:]]/}"

==部分をさまざまな方法で追加してみましたが、成功しませんでした。私が得た最も近いものは次のとおりです。

VG_MY="${VG_MY//[==[:digit:]==]/}"

これにより、valgrind出力からすべての数字と '='が削除されます。次のようにvalgrind出力から "="で囲まれた数だけを削除するには、私が何を見逃しているのかを調べる必要があります。 ==123456== 。

編集:valgrind出力の例:

==94953== Memcheck, a memory error detector
==94953== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==94953== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==94953== Command: ./executable
==94953== 
==94953== 
==94953== HEAP SUMMARY:
==94953==     in use at exit: 0 bytes in 0 blocks
==94953==   total heap usage: 13 allocs, 13 frees, 232 bytes allocated
==94953== 
==94953== All heap blocks were freed -- no leaks are possible
==94953== 
==94953== For counts of detected and suppressed errors, rerun with: -v
==94953== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 6)

答え1

または(またはスクリプトの後ろ)またはksh(またはスクリプトの後ろ):bash -O extglobshopt -s extglobbashzsh -o kshglobset -o kshglobzsh

VG_MY=${VG_MY//+(=)+([0-9])+(=)/}

拡張正規表現演算子+(...)に似たksh拡張globです。 1つ以上と一致します。++(x)x

したがって、上記は、1と同様に、1つ以上の=s、1つ以上の10進数、1つ以上のsからなる=全てのシーケンスを除去する。sed -E 's/=+[0-9]+=+//g'

456==内部を削除できないわけではありません。==123====456==最初の置換は、==123====パターンと一致しないアイテムを残して削除するためです。これを削除するには、次のように変更できます。

VG_MY=${VG_MY//+(=)[0-9]*([0-9=])=/}

(良いsed -E 's/=+[0-9][0-9=]*=//g'

zsh自己拡張glob(zsh -o extendedglob)の使用:#ERE*##ERE +(and (#c1,3))と同じです{1,3}。したがって、次のようにすることができます。

set -o extendedglob
VG_MY=${VG_MY//=##[0-9]##=##/}

1複数のsed実装が拡張正規表現をサポートしていますが、まだ-E標準ではなく、時々それをサポートしていない実装を見つけることができることに注意してください。これはスキップしてBRE代替品-Eとして使用することができます(または代わりに使用)。\{1,\}+==*=+

答え2

==94953==出力を比較する前に、各行の先頭を削除してください。

valgrind --leak-check=full ./executable1 <inputfile 2>&1 | sed 's/^==[0-9]*== //' >output1
valgrind --leak-check=full ./executable2 <inputfile 2>&1 | sed 's/^==[0-9]*== //' >output2

diff -u output1 output2 

または、変更されていない出力を保存し、実行時にのみ変更できますdiff

valgrind --leak-check=full ./executable1 <inputfile >output1 2>&1
valgrind --leak-check=full ./executable2 <inputfile >output2 2>&1

diff -u <( sed 's/^==[0-9]*== //' <output1 ) <( sed 's/^==[0-9]*== //' <output2 )

関連情報