删除 sed 中与部分字符串匹配的所有单词

删除 sed 中与部分字符串匹配的所有单词

假设我有以下行:

group blue:green yellow green redtomblue black !greyTOMwhilte !purple redblue

我需要使用 sed 从其中删除所有包含字符串“tom”或“TOM”的单词。

我已经做到了这一点:

sed 's/^ *\(.*\)[!]*[A-Za-z0-9_]*[tT]\{1\}[oO]\{1\}[mM]\{1\}[A-Za-z0-9_]*\(.*\)/\1 \2/g'

但这只会删除最后的发生,但不是全部。使用上面的例子,结果是:

group blue:green yellow green redtomblue black !grey  !purple redblue

如何使用sed删除包含特定子字符串“tom”或“TOM”的任何单词?

答案1

这个如何?

sed 's/\S*\(tom\|TOM\)\S*//g'

在非 GNU 版本中sed应该可以工作:

sed 's/[a-zA-Z0-9_!]*[Tt][Oo][Mm][a-zA-Z0-9_!]*//g'

这将取代所有(即以 0 个或多个非空白字符(\S)开头的字符串,后跟tomTOM以及 0 个或多个非空白字符)带有空字符串。
可能您还应该删除双空格:

sed 's/\S*\(tom\|TOM\)\S*//g;s/\(\s\)\s*/\1/g'

相关内容