Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 如何在正则表达式中为sed命令replace允许\b_Regex_Bash_Sed - Fatal编程技术网

Regex 如何在正则表达式中为sed命令replace允许\b

Regex 如何在正则表达式中为sed命令replace允许\b,regex,bash,sed,Regex,Bash,Sed,我有一个文本文件temp.txt,其中包含 你好,世界 我的名字是玛尤卡 我叫马尤克 我叫马尤克 我叫马尤克 我叫马尤克 sed命令 sed 's/\b[M,m][A,a][Y,y][U,u][K,k][H,h]\b/sobo/g' temp.txt 未将出现的Mayukh替换为sobo 但是没有\b的sed命令正在工作 sed 's/[M,m][A,a][Y,y][U,u][K,k][H,h]/sobo/g' temp.txt 但它也在将MayukhSarkar替换为soboSarkar

我有一个文本文件temp.txt,其中包含

你好,世界
我的名字是玛尤卡
我叫马尤克
我叫马尤克
我叫马尤克
我叫马尤克
sed命令

sed 's/\b[M,m][A,a][Y,y][U,u][K,k][H,h]\b/sobo/g' temp.txt
未将出现的
Mayukh
替换为
sobo

但是没有
\b
的sed命令正在工作

sed 's/[M,m][A,a][Y,y][U,u][K,k][H,h]/sobo/g' temp.txt
但它也在将
MayukhSarkar
替换为
soboSarkar

$ sed -r 's/(^|[^[:alnum:]])[Mm][Aa][Yy][Uu][Kk][Hh]([^[:alnum:]]|$)/\1sobo\2/' file
Hello World
My name is MayukhSarkar
My name is sobo
My name is sobo
My name is sobo
My name is sobo
或者使用您似乎正在使用的基本功能:

sed 's/\(^\|[^[:alnum:]]\)[Mm][Aa][Yy][Uu][Kk][Hh]\([^[:alnum:]]\|$\)/\1sobo\2/'
 file
使用GNU时:

$ sed 's/\bmayukh\b/sobo/i' file                   
Hello World
My name is MayukhSarkar
My name is sobo
My name is sobo
My name is sobo
My name is sobo
使用GNU awk:

$ awk 'BEGIN{IGNORECASE=1} {sub(/\<mayukh\>/,"sobo")} 1' file                
Hello World
My name is MayukhSarkar
My name is sobo
My name is sobo
My name is sobo
My name is sobo

使用
sed
应该最有效:

sed -E 's/(^| )[Mm][Aa][Yy][Uu][Kk][Hh]( |[^S]|$)/\1sobo\2/g' temp.txt
OSX
中,
-E
选项将正则表达式解释为扩展(现代)正则表达式(ERE),而不是基本正则表达式(BRE)。在
Linux
中,这将是
-r

使用
awk
gsub
替换特定的不区分大小写的单词非常简单:

awk '{gsub(/(^| )[Mm][Aa][Yy][Uu][Kk][Hh]( |$)/," sobo ");print}' temp.txt
这应该适用于所有平台,
OSX
Linux
,等等

编辑:如果要替换的单词恰好在开头、结尾或行中,则需要将模式复杂化一点:

awk '{gsub(/(^| )[Mm][Aa][Yy][Uu][Kk][Hh]( |$)/,"-sobo-");gsub(/^-sobo-/,"sobo ");gsub (/-sobo-$/," sobo");gsub (/-sobo-/," sobo "); print}'
这将基本上使它在被替换的单词的前面或后面没有空格

结果:

My name is MayukhSarkar
My name is sobo 
My name is sobo 
My name is sobo 
My name is sobo 

[]
类中不使用逗号。所以
[M,M]
是三个字符
M
M
,和
。您想要的是
[Mm]
。您使用的是
sed
的哪个版本?请尝试将模式包含在
\
中。我尝试了[Mm]但是它不起作用……此外,sed-V其他版本的它吐出了错误,用\<和\>括起来意味着什么呢注:对于
OSX
和一些版本的
sed
来说,
regex
选项是
-E
而不是
-r
@bkmoney,我的意思是可移植的,因为它不依赖于特定的参数,
-r
,或者
-E
启用ERE,因为这似乎是现代SED之间的主要区别-它们不能处理ERE或不处理ERE,但您使用什么参数来告诉它们识别未替换的ERE元字符。@josifoski,如果您能想出一个awk解决方案,那将非常好。我遇到了麻烦,因为awk并不真正支持捕获组。@bkmoney GNU awk有gensub()和match(str、re、arr),它们都支持捕获组。一般来说,对于任何非呆滞的情况,都需要使用match()+substr()来模拟捕获组。我添加了一些AWK解决方案来演示。@ BKFooy是的,它是一个可怜的MOS替代品——考虑一下你在每一行上如何做而不是一次(暗示它是一个非平凡的循环)!这就是gawk扩展的驱动力——否则做这项工作的难度。gawk可以很容易地引入许多增强功能,但最终会导致语言膨胀(例如,p***:-),因此gawk的工作人员只关注为功能提供增强功能,而这些功能在其他情况下极难编写。世界只需要得到GNU awk:-)。这并不容易-如果在该位置发生
mayukh
时,您发布的内容会在行首或行尾添加一个空格。如果在命令运行之前文件中存在
-sobo-
,则上面的第二个awk命令会损坏文件。@EdMorton,现在您只是挑剔了。我的建议是无论如何都要使用
sed
,我很想把
awk
示例全部删除,因为它不会给答案增加任何有价值的东西。挑剔?一点也不,即使在我懒洋洋的懒惰的日子里,我也从来没有考虑添加一个纯文本字符串,然后不得不删除它,希望它在输入中已经不存在了!如果你想使用这种方法,那么正确的方法是:awk{gsub(/a/,“aA”);gsub(/(^ |)[Mm][aA][Yy][Uu][Kk][Hh](|$)/,“aB”);gsub(/^aB/,“sobo”);gsub(/aB/,“sobo”);gsub(/aA/,“a”);print},但对于mayukh自己的一行来说,这仍然会失败。
My name is MayukhSarkar
My name is sobo 
My name is sobo 
My name is sobo 
My name is sobo