替换多个空格后的单词

3

我需要在多个空格后替换一个单词:

实际上,该文件包含以下字符串:

local   all             all                                     peer

我必须用

来更改它。

local   all             all                                     md5

我尝试了各种组合,包括

sed -i.bak 's/all[\+ ]peer/md5/g'  file

没有运气。
有什么想法吗?
提前致谢。
6个回答

4
尝试使用 GNU sed 版本 4.2.1 进行如下操作:
sed -E -i.bak 's/(all\s+)peer/\1md5/' file

2
+1 我会将 all + 泛化为 all[[:space:]]+,以便捕捉制表符和空格。 - glenn jackman
@David 那么将一个答案标记为正确的答案会很好。 :) - speakr
@speakr:谢谢...我不知道我必须这样做...我以为答案得票最多会自动选中呢,哈哈。 - David

2

我是否错过了这个问题的某些部分?我创建了一个内容为上述第一行的文件,然后对其运行最简单的sed命令……结果得到了第二行。

~ >cat test.txt
local   all             all                                     peer

~ >sed 's/peer/md5/g' test.txt
local   all             all                                     md5

同样适用于多行的情况...

~ >cat test.txt
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
~ >sed 's/peer/md5/g' test.txt
local   all             all                                     md5
local   all             all                                     md5
local   all             all                                     md5
local   all             all                                     md5
local   all             all                                     md5
local   all             all                                     md5

唯一不能奏效的情况是,当您不想将“peer”替换为md5时,它出现在其他地方的某一行上...

这个仅替换第一个搜索项出现的地方:

~ >cat test.txt
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
~ >sed '0,/peer/s//md5/' test.txt
local   all             all                                     md5
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer
local   all             all                                     peer

也许使用s/\bpeer\b/md5/s/\<peer\>/md5/会更保险。 - potong
嗨Ron,是的,有多行包含"local all all"和多行以"peer"结尾的。 - David
嘿,Ron...这会在每一行中更改“peer”这个词!这不是我要找的。 - David
嘿,大卫,把所有的标准都放在问题里是个好主意。 :-) - Ron Savage
抱歉 @RonSavage :) 你是对的... 我往往过于概括了。 - David

2

GNU sed

sed -r -i.bak '/^local\s+(all\s+){2}peer$/s/\S+$/md5/' file

这也将删除前面的 all ... 子字符串。 - speakr
@David 嗯,我现在重新测试了一下,它可以适用于GNU sed版本4.2.1。我可以截图给你。 - Endoro
@David 顺便说一下,我在另一个评论中看到,你只需要替换一行代码?但这并没有在你的问题中提到 :confused: - Endoro
Endoro,是的,但这不是重点...我可以更改所有包含该内容的行(只有一行),重点是当遇到“local all all”时,我需要替换掉“peer”这个词,其他的都保持不变 :) - David
是的,你说得对,我的代码总是删除同行(每个单词的结尾),抱歉。但我会研究一下 :) - Endoro
@David添加了这行的完整地址,抱歉耽误了 :) - Endoro

1
sed 's/\(all *all  *\).*/\1md5/'

1

Try this one:

sed -i.bak -e "s/\(all[ ]\+\)peer/\1md5/g" file

你需要转义 ()+ 字符。空格可以使用 [ ],使用 \+ 表示它应该大于 0。如果在 "all" 和 "peer" 之间没有空格,则用 * 替换。
在替换部分中,你应该使用 \1 - 对第一个找到的部分进行反向引用: all,只有 peer 会被替换为 md5

谢谢Kostanos,但我遇到了这个错误:sed:-e表达式#1,char 1:未知命令:“ -” - David
抱歉,-i和-e参数的顺序不正确。已经编辑了答案,请再试一次。 - Kostanos
这个也很好用! :) 谢谢 - David

1
perl -pe 's/(all[\s]+)peer/$1md5/g' your_file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接