[英]Replace all forward slashes that are in paths, with backslash (so, not all forward slashes)
我有一個文件,文件路徑如下
c:/squid/etc/digpass
c:/squid/var/cache
c:/squid/var/logs/access
c:/squid/libexec/logfile
c:/squid/var/logs/cache
我想將/更改為\\
最好使用sed,但如果需要,則使用perl。 或兩者都很好。
我不能僅僅用\\
替換/
,因為存在無辜的/
(即/
應該保留, /
不屬於任何路徑)。
路徑與正則表達式模式c:/(\\w|/)*
匹配
在網址中有/
情況,例如http://
或帶有“ apples / oranges”的注釋。
所以我只想替換所有c:/ .....路徑內的/。
我怎樣才能做到這一點?
最好在sed中使用,但如果使用perl,則可以。 如果兩者都很棒。
添加
響應fedorqui,以獲取更多示例數據..和預期的輸出以及我嘗試過的
# 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
但是我可以看到它永遠都行不通。 我曾想過可能在/
周圍捕獲,但是路徑是可變的,如您從我的正則表達式中所見,該路徑與路徑“ C:/(\\ w | /)*”匹配,而且我不能真正在此處捕獲正斜線。 所以我不太明白如何去做。
您可以進行就地文件編輯,
perl -pe 's!(c:\S+)! ($x=$1) =~ y|/|\\|; $x !egi'
可能存在更好的解決方案,但是嘗試下一個:
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/!\\!)'
這將更改帶有空格的路徑,但會保留URL
some "c:/some path/here" and http://some/url
附:我想看一些更正確的解決方案,例如,在哪里做的更好,猜測什么是路徑,什么不是。
這也應該工作:
perl -pe 's~(?:\G(?!\A)|\bc:)[^\s/]*\K/~\\~gi'
\\G
是在上一個比賽結束時匹配的錨。 但是由於該錨也可以匹配字符串的開頭,因此必須通過添加(?!\\A)
來禁止這種情況
因此,該模式中有兩個可能的入口點:
\\bc:
這是目標路徑的開始 注意:使用第一個字符識別優化可以以更有效的方式編寫此模式:
perl -pe 's~/(?:(?<=\G/)|(?<=\bc:/))([^\s/]*)~\\$1~gi'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.