2017-07-07 38 views
1

我使用bash動態查找並用另一個字符串替換字符串,例如動態匹配並使用Bash替換

href="/controller/action" 

href="<?php echo $this->url("controller", action-> "action") ?>" 

我使用這個sed命令來查找和更改它的正常工作......

sed -i 's%href=\"/controller/action%href=\"<?php echo $this->url(\"controller\", action-> \"action\") ?>%g' changes.txt 

我要的是舊的字符串來尋找任何類型的以下使用模式通配符。我看到這是一個選項,但不起作用。

sed -i 's%href=\"/(.*)/(.*)%href=\"<?php echo $this->url(\"/1\", action-> \"/2\") ?>%g' changes.txt 

我如何能夠運行這個命令,使控制器和動作可以是任何東西,並從老的字符串動態拍攝並輸入到新的字符串?

+0

以什麼方式不工作?錯誤的輸出,沒有輸出,錯誤信息,核心轉儲,別的東西?想象一下,把你的汽車交給機修工,讓你解決問題的唯一線索就是「這輛車不行」。 –

+1

給這個鏡頭:sed -i's%href = \「/([^)] +)/([^)] +)%href = \」<?php echo $ this-> url(\「/ 1 \「,action-> \」/ 2 \「)?>%g'changes.txt我猜測。*正在搞亂。你可以把它們改成。*?如果你覺得自己很懶,或者我在那裏。如果這個作品讓我知道,我會寫一個更好的答案。 – sniperd

+0

感謝狙擊手我會給你一槍!有一些正則表達式oO。我想用不懶惰的版本來嘗試:P。埃德,沒有錯誤,沒有變化,沒有核心轉儲和沒有破車:) – SmiffyKmc

回答

2

您正在使用貪婪的點匹配模式,因爲點符合任何符號,因此幾乎不需要您輸入數字,並且量化器儘可能多地捕獲字符。你需要的是一個否定支架表達式[^/]*匹配除/以外的零個或多個字符。

另外,由於您使用的是BRE POSIX正則表達式,因此您必須使用圓括號捕捉模式的一部分,否則它們將表示文字()符號。

使用

sed -i 's%href="/\([^/]*\)/\([^/]*\)%href="<?php echo $this->url("\1", action-> "\2") ?>%g' changes.txt 
+0

我只是在你發送了這個消息後才設法得到它。沒有\(.... \),並且我的值在新字符串中有/ 1和/ 2,應該是\ 1和\ 2。我知道這是一個技術上不同的問題,但希望你能夠擺脫一些光或資源來看看自己。以上作品完美。但會有類似/ foo/bar的鏈接?type = R&year = <?php echo $ year;?>&batchNumber = <?php echo $ this-> escapehtml($ animal-> BATCH_NUMBER);?>「><?php echo $ this-> escapehtml($ animal-> BATCH_NUMBER);?>會將它搞亂一點,如何跳過? – SmiffyKmc

+0

@SmiffyKmc該字符串是否匹配? –

+0

@SmiffyKmc如果不匹配,試試'href =「/ \([^/<>] \ + \)/ \([^ /?<>] \ + \)\ b \([^?] | $ \)'並在替換字符串的末尾添加'\ 3'。 –