두 개의 서로 다른 실행 파일을 사용하여 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 extglob
shopt -s extglob
bash
zsh -o kshglob
set -o kshglob
zsh
VG_MY=${VG_MY//+(=)+([0-9])+(=)/}
확장 정규식 연산자 +(...)
와 유사한 ksh 확장 glob입니다 . 하나 이상의 와 일치합니다.+
+(x)
x
따라서 위의 내용은 1과 마찬가지로 하나 이상의 =
s, 하나 이상의 십진수, 하나 이상의 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 )