Linux 替换为同一行中的多个事件

Linux 替换为同一行中的多个事件,linux,bash,sed,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*\)\(\\\|\/\)

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

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/
使用GNU时:

sed -E 's:([^\])/:\1\\/:g;s:\\/([^\]*( |$)):/\1:g' file
此处有两个
s
命令:

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

粗略地翻译,这表示“用反斜杠和相同的东西(以及第二个斜杠)替换字符串中的一个单独的斜杠,然后再替换另一个单独的斜杠。在替换后,重新开始。”

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

前面没有反斜杠

(?!\w+\s)

不后跟以空格结尾的单词字符

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

perl-pe;(?谢谢,但这并不能做到这一点,因为您描述的第二步还替换了一些“\/”在初始版本中有,我不想要。你破解了它!感谢你从头到尾的帮助!我还处理斜杠前有下划线的情况,这很好。@user2405602:干杯!很乐意帮助!
perl -pe 's;(?<!\\)/(?!\w+\s);\\/;g' file
nocareNocare abc\/def\/ghi\/mno\/pq/r   abc\/def\/ghi\/mno\/pq/r