Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在多个空格后替换单词_Regex_Replace_Sed - Fatal编程技术网

Regex 在多个空格后替换单词

Regex 在多个空格后替换单词,regex,replace,sed,Regex,Replace,Sed,我需要在多个空格后替换一个单词: 实际上,该文件包含以下字符串: local all all peer 我必须用它来换 local all all md5 我尝试了各种组合,包括 sed -i.bak 's/all[\+ ]peer/md5/g' file 没有运气 有什么想法吗 提前使用T

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

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

local   all             all                                     peer
我必须用它来换

local   all             all                                     md5
我尝试了各种组合,包括

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

有什么想法吗

提前使用Thx

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

逗号分隔符 试试这个:

sed -i.bak -e "s/\(all[ ]\+\)peer/\1md5/g" file
您需要转义
()+
字符。 空格可以是这样的:
[]
如果
\+
您说它应该大于0。如果在某些情况下,“所有”和“对等”之间没有空格,请将其替换为
*


在替换部件中,您应该使用
\1
-返回对第一个找到的部件的引用:
全部
,并且只有
对等
将被替换为
md5

我是否缺少此问题的某些部分?我制作了一个以上面第一行为内容的文件,然后对其运行尽可能简单的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

这也将删除前面的
all…
子字符串。@David hmmm,我现在再次测试了它,它与
GNU-sed版本4.2.1
一起工作。我可以做一个屏幕截图。@David顺便说一句。我在另一条评论中读到,您只需要在一行中替换?这不是你的问题:困惑:恩多,是的,但这不是重点。。。我可以更改包含该内容的所有行(只有一行),重点是我只需要在跟随“local all”时替换peer一词,其他所有内容保持原样:)只有在跟随时:是的,你是对的,我的代码总是删除peer(结尾的每个词),对不起。但是我会研究它:)+1我会将
all+
概括为
all[[:space:][]+
来选择选项卡以及spaces@David那么,最好将答案标记为正确答案。:)@斯派克:谢谢。。。我不知道我必须这么做。。。我认为答案会自动获得更多的选票,也许
s/\bpeer\b/md5/
s/\/md5/
是出于安全考虑。嗨,罗恩,是的,有多行带有“local-all-all”和多行以“peer”结尾:。。。这改变了每一行的单词peer!这不是我想要的。嘿,大卫,把所有的标准都放在这个问题上是个好主意。:-)抱歉@RonSavage:)你说得对。。。我总结得太多了。谢谢Kostanos,但我得到了以下错误:sed:-e expression#1,char 1:unknown命令:`-'对不起,-I和-e参数的顺序不正确。已编辑答案,请再试一次。此答案也适用!:)谢谢
~ >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
~ >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
perl -pe 's/(all[\s]+)peer/$1md5/g' your_file