使用 sed 查找整个单词并替换

maG*_*aGz 6 command-line sed replace

我在文件中有以下文本块:

test3.legacy test4.legacy test3 test3.kami
Run Code Online (Sandbox Code Playgroud)

我只想test3作为一个整体搜索并用空替换它。不幸的是,我所有的尝试都从和 中删除了test3。我试过了:test3.legacytest3.kami

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt
Run Code Online (Sandbox Code Playgroud)

没有任何运气。有什么想法可以解决这个问题吗?

编辑:大多数尝试导致以下结果:.legacy test4.legacy .kami

Run*_*ium 6

这是你想要的吗?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami
Run Code Online (Sandbox Code Playgroud)

这说

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)
Run Code Online (Sandbox Code Playgroud)

更新:

正如好人@Stephane Chazelas优雅地提出的那样,这不会处理某些情况。还要强调便携性部分。请参阅下面的答案

GNU 变体可以(希望)是:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'
Run Code Online (Sandbox Code Playgroud)

处理重复的比赛。可选地,一个人也会照顾多个空间等。视输入而定。

欧普德


作为替代方案(仅作为起点):

sed 's/\Wtest3\W/ /g'
Run Code Online (Sandbox Code Playgroud)

不是这个我假设:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy
Run Code Online (Sandbox Code Playgroud)