我想删除遵循以下模式的文本中的所有匹配项:
- 每场比赛都以 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 " "