![Используйте sed, чтобы найти целое слово и заменить его](https://rvso.com/image/31683/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B9%D1%82%D0%B5%20sed%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BD%D0%B0%D0%B9%D1%82%D0%B8%20%D1%86%D0%B5%D0%BB%D0%BE%D0%B5%20%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%20%D0%B8%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE.png)
У меня есть следующий блок текста в файле:
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
Пожалуйста, попробуйте выше