用同一行代替SED多次出现

除了每个string的最后一个string之外,我想用字母数字和反斜杠+斜杠“\ /”之间的所有斜线“/”来replace,例如

nocareNocare abc\/def/ghi/mno\/pq/r abc\/def\/ghi/mno\/pq/r 

应该成为:

 nocareNocare abc\/def\/ghi\/mno\/pq/r abc\/def\/ghi\/mno\/pq/r 

我用:

 sed 's/\(.*\)\([[:alnum:]]\)\/\([[:alnum:]]\)\(\S*\)\(\\\|\/\)/\1\2\\\/\3\4\//g' 

简短的解释:匹配

任何string+ alnum + / +任何非白+ /或\

但是它只能代替一个案例,所以我需要运行3次才能取代所有3个案例。 看起来像它第一次匹配所有的方式来:

 >nocareNocare abc\/def/ghi/mno\/pq/r abc\/def\/ghi/ 

代替

 >nocareNocare abc\/def/ 

您可以使用基于以下regExperl命令行解决方案

(?<!\\)

前面没有反斜杠

(?!\w+\s)

没有后面跟着以空白结尾的单词字符

 perl -pe 's;(?<!\\)/(?!\w+\s);\\/;g' file nocareNocare abc\/def\/ghi\/mno\/pq/r abc\/def\/ghi\/mno\/pq/r 
 sed -e :a -e 's|\([a-z0-9]\)/\([a-z0-9][^ ]*[a-z0-9]/[a-z0-9]\)|\1\\/\2|;ta' filename 

松散地翻译,这就是说“替换一个单独的斜线,然后是字符串中的其他东西,然后是另一个单斜线,反斜杠 – 斜线和相同的东西(和第二个斜线),并在做出这样的替换之后,重新开始“。

用GNU sed:

 sed -E 's:([^\])/:\1\\/:g;s:\\/([^\]*( |$)):/\1:g' file 

这里有两个命令:

  • s:([^\])/:\1\\/:g全部替换/不是前面加\/
  • s:\\/([^\]*( |$)):/\1:g用空格或换行符之前的空格或行尾替换/