我有一个文件,文件路径如下
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 | /)*"而我无法捕捉那里的前锋斜线。所以我不太清楚如何解决这个问题。
答案 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'