使用 ${VARNAME//pattern/} 方式从字符串中删除数字和符号的组合

Yek*_*vel 2 bash regular-expression delete

我正在尝试编写一个脚本,使用两个不同的可执行文件对 valgrind 的输出执行差异,但每行开头的进程 ID 乱扔我的差异输出。我正在尝试使用 bash 命令将其删除,但似乎无法成功。

到目前为止,这是我的代码:

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

这从 VG_MY 中删除所有数字,与此相同:

VG_MY="${VG_MY//[[:digit:]]/}"
Run Code Online (Sandbox Code Playgroud)

我尝试以多种方式添加 == 部分,但都没有奏效。我最接近的是:

VG_MY="${VG_MY//[==[:digit:]==]/}"
Run Code Online (Sandbox Code Playgroud)

从 valgrind 输出中删除所有数字 AND '=' 。我需要弄清楚我缺少什么,以便从 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)
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 7

使用kshbash -O extglob(或shopt -s extglobbash脚本中之后)或zsh -o kshglob(或set -o kshglobzsh脚本中之后):

VG_MY=${VG_MY//+(=)+([0-9])+(=)/}
Run Code Online (Sandbox Code Playgroud)

+(...)是一个类似于+扩展正则表达式运算符的 ksh 扩展 glob 。+(x)匹配一个或多个xs。

因此,上面删除了一个或多个=s 后跟一个或多个十进制数字后跟一个或多个=s 的所有序列,就像sed -E 's/=+[0-9]+=+//g'¹ 一样。

并不是说它无法删除 456==内部,==123====456==因为第一次替换会删除==123====留下与模式不匹配的东西。为了能够删除这些,您可以将其更改为:

VG_MY=${VG_MY//+(=)[0-9]*([0-9=])=/}
Run Code Online (Sandbox Code Playgroud)

(喜欢sed -E 's/=+[0-9][0-9=]*=//g'

Withzsh自己的扩展 globs ( zsh -o extendedglob):#相当于 ERE*##ERE +(和(#c1,3)of {1,3})。所以,你可以这样做:

set -o extendedglob
VG_MY=${VG_MY//=##[0-9]##=##/}
Run Code Online (Sandbox Code Playgroud)

¹ 请注意,虽然有几个sed实现支持-E扩展正则表达式,但它还不是标准的,您偶尔会发现一些不支持它的实现。有了这些,您可以跳过-E\{1,\}用作 BRE 替代品+(或使用==*代替=+)。