문자열에서 숫자와 기호의 조합을 제거하려면 ${VARNAME//pattern/}을 사용하세요.

문자열에서 숫자와 기호의 조합을 제거하려면 ${VARNAME//pattern/}을 사용하세요.

두 개의 서로 다른 실행 파일을 사용하여 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입니다 . 하나 이상의 와 일치합니다.++(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 )

관련 정보