Используйте sed, чтобы найти целое слово и заменить его

Используйте sed, чтобы найти целое слово и заменить его

У меня есть следующий блок текста в файле:

test3.legacy test4.legacy test3 test3.kami

Я хочу только искать test3целиком и заменить его ничем. К сожалению, все мои попытки удалилитест3из test3.legacyи test3.kami. Я пробовал:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

безуспешно. Есть идеи, как это решить?

РЕДАКТИРОВАТЬ:Большинство попыток привели к следующему:.legacy test4.legacy .kami

решение1

Это то, чего ты хочешь?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

Это говорят

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

Обновлять:

И как так элегантно выразился хороший@Стефан Шазеласэто не позаботится о некоторых случаях. Также подчеркните часть о переносимости. Смотретьответ ниже.

Вариант GNU мог бы,(с надеждой), быть:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

забота о повторяющихся совпадениях. По желанию можно также заботиться о множественных пробелах и т. д. В зависимости от ввода.

ЕОПД


В качестве альтернативы, возможно (предназначено только как отправная точка):

sed 's/\Wtest3\W/ /g'

Я не думаю, что это так:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

решение2

Учитывая ваш пример , я бы поискал test3, обернутый пробелом с обеих сторон, \sвместо того, чтобы пытаться использовать обозначение границ слов.

Например

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

Вышеуказанный поисккосмостест3космоси заменяет это простокосмос.

ПРИМЕЧАНИЕ:Это не обработает ситуацию, когда test3 является первым в списке!

решение3

Портативно:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

То есть:

  • сначала добавьте пробел в начале и конце строки, чтобы не учитывать test3начало и конец специально,
  • заменить test3заключенные в пробелы одинарным пробелом,
  • повторяйте процесс до тех пор, пока есть замены (для покрытия случаев test3 test3).
  • Удалите начальные и конечные пробелы, которые мы добавили изначально.

решение4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

Пожалуйста, попробуйте выше

Связанный контент