用反斜杠替换路径中的所有正斜杠(因此,不是所有正斜杠)

时间:2014-09-09 14:28:08

标签: regex linux perl sed

我有一个文件,文件路径如下

c:/squid/etc/digpass
c:/squid/var/cache
c:/squid/var/logs/access
c:/squid/libexec/logfile
c:/squid/var/logs/cache

我想将/更改为\

优选在sed中但如果需要则在perl中。或者两者都很棒。

我无法用/替换\,因为有/的无辜案例(即/应该留下,{ {1}}不属于任何路径。)

路径与正则表达式模式/

匹配

c:/(\w|/)*个案例,例如在网址,/或评论中说" apples / oranges"。

所以我想只替换那些c:/ .....路径中的所有/。

我该怎么做?

最好是在sed,但如果perl则很好。如果两者都很好。


响应fedorqui,获取更多样本数据..和预期输出以及我尝试的内容

http://

我希望只使用# This is the default Squid configuration file. You may wish # to look at the Squid home page (http://www.squid-cache.org/) ... # include /path/to/included/file/squid.acl.config # # Includes can be nested up to a hard-coded depth of 16 levels. ... # auth_param basic program c:/squid/libexec/ncsa_auth c:/squid/etc/passwd ... access_log c:/squid/var/logs/access.log squid ..

重写c:/路径

至于我的尝试。我尝试使用正则表达式匹配路径

\

我试了一行

C:\squid\etc>grep -ioP "C:/(\w|/)*" squid.conf c:/squid/libexec/ncsa_auth c:/squid/etc/passwd c:/squid/libexec/digest_auth_pw ...... C:\squid\etc>grep -ioP "C:/(\w|/)*" squid.conf | wc -l 20

但我能看到它永远不会工作。我想到的可能是在sed C:\squid\etc>sed -ir "s#c:/(\w|/)*#" squid2.conf周围捕捉,但是路径是可变的legnth,你可以从我的正则表达式中看到匹配路径" C:/(\ w | /)*"而我无法捕捉那里的前锋斜线。所以我不太清楚如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

您可以进行就地文件编辑,

perl -pe 's!(c:\S+)! ($x=$1) =~ y|/|\\|; $x !egi'

答案 1 :(得分:2)

可能存在更好的解决方案,但尝试下一个:

perl -i.bak -pe '1 while(s!c:\S*?\K/!\\!)' files...

在上面c:/some/path不应包含空格。因为c:/some path/here无效。

替代方案,如果可以包含空格,但不能包含:(例如在http://中)

perl -pe '1 while(s!c:[^:]*?\K/!\\!)'

这将更改带空格的路径,但会保留网址

some "c:/some path/here" and http://some/url

Ps:我想看一些更正确的解决方案,例如:在哪里做得更好,猜测什么是路径,什么不是。

答案 2 :(得分:2)

这也应该有效:

perl -pe 's~(?:\G(?!\A)|\bc:)[^\s/]*\K/~\\~gi'

\G是在上一场比赛结束时匹配的锚点。但由于此锚也可以匹配字符串的开头,因此您必须通过添加(?!\A)来禁止这种情况

因此,模式中有两个可能的入口点:

  • 上一场比赛结束(必须进行连续比赛)
  • \bc:这是目标路径的开头

注意:使用第一个字符识别优化可以更有效地编写此模式:

perl -pe 's~/(?:(?<=\G/)|(?<=\bc:/))([^\s/]*)~\\$1~gi' 

link to regexstorm.net