3

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

实际上文件包含这个字符串:

local   all             all                                     peer

我必须改变

local   all             all                                     md5

我尝试了各种组合,包括

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

没有运气。

任何想法 ?

提前谢谢

4

6 回答 6

4

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

sed -E -i.bak 's/(all\s+)peer/\1md5/' file
于 2013-06-09T22:51:19.963 回答
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
于 2013-06-09T23:15:48.827 回答
2

GNU sed

sed -r -i.bak '/^local\s+(all\s+){2}peer$/s/\S+$/md5/' file
于 2013-06-09T22:55:10.570 回答
1
sed 's/\(all *all  *\).*/\1md5/'
于 2013-06-09T22:51:34.100 回答
1

试试这个:

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

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

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

于 2013-06-09T23:04:34.087 回答
1
perl -pe 's/(all[\s]+)peer/$1md5/g' your_file
于 2013-06-10T06:19:03.887 回答