我有一個包含復雜多行命令和一些不相關文本的檔案。我需要在某些路徑(例如/foo)前面加上前綴/bar。該腳本可以運行多次,但不得/bar在同一路徑前添加多個前綴。例如,運行腳本一次 get /bar/foo,再次運行它,仍然是get /bar/foo,而不是/bar/bar/foo。我必須使用sed與現有代碼庫保持一致。
我想出了想要的結果(如下),但我的方法似乎很麻煩。有沒有更好(更短,重復更少)的方法?
$ echo '/foo' > infile
$ cat infile
"/foo" /foo
# Replace once, change expected:
$ sed -i '\#bar/foo#!s#\(/foo\)#/bar\1#g' infile
$ cat infile
"/bar/foo" /bar/foo
# Replace twice - no change expected:
$ sed -i '\#bar/foo#!s#\(/foo\)#/bar\1#g' infile
$ cat infile
"/bar/foo" /bar/foo
編輯:不要使用我的“解決方案”:在重要的邊緣情況下是錯誤的,請參閱下面的評論
uj5u.com熱心網友回復:
您可以將此sed解決方案與可選組一起使用來替換/foo,但在已經存在/bar/foo時跳過匹配:/bar
sed -E 's~(/bar)?(/foo)~/bar\2~g' file
正則運算式演示
細節:
(/bar)?:在捕獲組 #1 中匹配可選/bar(/foo)/foo:在捕獲組 #2 中匹配/bar\2: 替換為總是放/bar后面跟著我們在捕獲組 #2 中捕獲的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458778.html
上一篇:對第一個句子進行re.search后回傳后面句子的字串
下一篇:Regexp回傳位置VBA
