![删除包含字符串的所有匹配项,直到其下一个空格](https://linux22.com/image/150612/%E5%88%A0%E9%99%A4%E5%8C%85%E5%90%AB%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E9%A1%B9%EF%BC%8C%E7%9B%B4%E5%88%B0%E5%85%B6%E4%B8%8B%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC.png)
我想删除遵循以下模式的文本中的所有匹配项:
- 每场比赛都以 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 " "