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

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

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

test3.legacy test4.legacy test3 test3.kami

我只想test3整体搜索并用任何东西替换它。不幸的是,我所有的尝试都被删除了测试3test3.legacytest3.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

请尝试以上

相关内容