在同一行更换SED多次出现

时间:2016-12-14 11:13:05

标签: linux bash sed

除了每个字符串的最后一个之外,我想用字母数字和反斜杠+斜杠“\ /”替换所有斜杠“/”,例如。

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'

简短说明:匹配

  

任何字符串+ alnum + / +任何非白色+ /或\

但它只能替换一个案例,所以我需要运行它3次以替换所有3次出现。看起来它第一次匹配到:

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

而不是

>nocareNocare abc\/def/

3 个答案:

答案 0 :(得分:3)

sed -e :a -e 's|\([a-z0-9]\)/\([a-z0-9][^ ]*[a-z0-9]/[a-z0-9]\)|\1\\/\2|;ta' filename

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

答案 1 :(得分:1)

使用GNU sed:

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

这里有两个s命令:

  • s:([^\])/:\1\\/:g将所有/替换为\之后\/
  • s:\\/([^\]*( |$)):/\1:g使用\/
  • 替换空格或行尾之前的最后/

答案 2 :(得分:1)

您可以根据以下perl使用regEx命令行解决方案

(?<!\\)

前面没有反斜杠

(?!\w+\s)

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

perl -pe 's;(?<!\\)/(?!\w+\s);\\/;g' file
nocareNocare abc\/def\/ghi\/mno\/pq/r   abc\/def\/ghi\/mno\/pq/r