删除包含字符串的所有匹配项,直到其下一个空格

删除包含字符串的所有匹配项,直到其下一个空格

我想删除遵循以下模式的文本中的所有匹配项:

  • 每场比赛都以 linux- 开始
  • 每场比赛都以空格结束
  • (删除 linux-* 直到紧邻的下一个空格)

示例:摘自本文:

ibudev1 libudev1 libweather-ion7 libxatracker2 linux-generic linux-headers-generic linux-image-generic linux-libc-dev linux-signed-generic mesa-va-drivers mesa-va-drivers mesa-vdpau-drivers mesa-vdpau-drivers milou

得到这个:

ibudev1 libudev1 libweather-ion7 libxatracker2 mesa-va-驱动程序 mesa-va-驱动程序 mesa-vdpau-驱动程序 mesa-vdpau-驱动程序 milou

它是要在Ubuntu、Bash环境上运行的。

答案1

perl -lpe 's/(?!<\S)linux-\S*(\s+|$)//g'

会做的。前提是linux-它前面没有非空格 ( (?!<\S)),后跟任意数量的非空格 ( \S*),后跟一个或多个空格 ( \s+),或者行尾不被替换为任何内容。

(?!<\S)向后查找检查是为了避免匹配linux-包名称中的发现内容,例如 in g++-i586-linux-gnu, util-linux-dbgsym...

请注意,我们删除了空格但不能在包名称之前。这意味着如果该行的最后一个单词是linux-*1,则后面会留下尾随空格。

答案2

sed 's/linux-[^ ]* //g'

[^ ]*匹配所有后面非空格的字符,并且*后面的字符表示一个或多个

答案3

printf '%s' "$list" | tr ' ' '\n' | grep -v '^linux-' | paste -sd " "

相关内容