2

Предположим, что у меня есть следующая строка:

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

Мне нужно удалить из него все слова, которые содержат строку "tom" или "TOM", используя sed.

Мне удалось получить это далеко:

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 ответ1

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), за которыми следуют tom или TOM и снова 0 или более непробельных символов) пустой строкой.
Возможно, вам также следует удалить двойные пробелы:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .