在多个空格后替换单词

时间:2013-06-09 22:44:53

标签: regex replace sed

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

实际上该文件包含此字符串:

local   all             all                                     peer

我必须改变

local   all             all                                     md5

我尝试了各种组合,包括

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

没有运气。

有什么想法吗?

提前谢谢

6 个答案:

答案 0 :(得分:4)

试试这个(使用GNU sed-Version 4.2.1):

sed -E -i.bak 's/(all\s+)peer/\1md5/' file

答案 1 :(得分:2)

GNU sed

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

试试这个:

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

您需要转义()+个字符。 空格可能如下:[ ] \+您说它应该大于0.如果在某些情况下您在“所有”和“之间没有空格”,请将其替换为*同行“

在替换部分中,您应该使用\1 - 对第一个找到的部分的反向引用:all,只有peer将替换为md5

答案 5 :(得分:1)

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