我的文件中有以下文本块:
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
请尝试以上