sed

2013-04-26 23 views
3

給出的前導正則表達式錯誤無效我是一個管理很多網站的輪換團隊的一員,我們繼承了一些特別糟糕的代碼,我們正在完全重新設計一個網站。可怕的是,開發服務器上存在一些鏈接,可將您引導至活動服務器和舊域以及許多其他可怕,可怕的事情。sed

我一直在試圖編寫一個grep/sed命令來替換所有這些鏈接,我們現在使用用戶定義的php函數full_link來阻止所有鏈接到不同的地方。因此(使用我們的域的佔位符)而不是編寫http://www.place.com/foo/bar,你會寫<?php echo full_link('foo/bar'); ?>,它將在我們從一臺服務器移動到另一臺服務器時起作用。

這裏就是我的了:

grep -v 'echo' * -r -P | grep "(?<=<a href=['\"])(http:\/\/foo\.bar\.net\/|10\.41\.6\.118\/|http:\/\/foo2\.bar\.net\/)([^<]*?)(?=['\"])" -P | sed -r "[email protected](?<=<a href=['\"])(http://foo\.bar\.net/|10\.41\.6\.118/|http://foo2\.bar\.net/)([^<]*?)(?=['\"])@<?php echo full_link('\2'); ?>@gpw output" 

(如果你想知道關於第一的grep或[^<],他們都只是一個基本的企圖保持從把php標記現有的PHP標籤內自。這只是第一次讓手動編輯少了完整的複製粘貼鏈接並重定向到錯誤的服務器,它不需要是完美的,但我打開更好的方式來做到這一點。)

I我已經得到了grep的聲明,並拿起了我想讓他們得到的東西,但是當我將sed添加到最後時,會發生什麼情況:

sed: -e expression #1, char 159: Invalid preceding regular expression 

從我做了什麼研究,好像我可能逃過我的sed的聲明不正確的東西,我已經嘗試了一些東西,但它永遠只給我指向一個相同的消息表達式的最後幾個字符。

+0

取代這種事情通常是用Perl – leonbloy 2013-04-26 00:29:03

回答

1
sed "s.http://[^/]*/.<?php echo full_link('.;s/$/'); ?>/" 
  • http://[^/]*/
  • <?php echo full_link('
  • $
  • 更換'); ?>
+1

容易@ user2319752。請注意,這依賴於替代字符'。'從替換模式中劃分搜索模式。 '/'是stnd separator字符(因爲,???我不知道,它是可見的嗎?),但是大多數sed允許使用其他字符,'s'後面的第一個字符是什麼,你經常會看到'|'和'@'作爲替代。有些seds要求你逃避替代字符的第一次使用,所以你可能需要''s \ .http:// ...'...祝大家好運 – shellter 2013-04-26 02:29:55

+0

是的,我使用@作爲分隔符,因爲這是一個並沒有在搜索或替換模式的任何地方,我真的很感謝精簡,但我最初分開了不同的可能的網址,因爲我不希望它取代外部鏈接,並且其中一種鏈接我必須替換它只是一個沒有任何'http://'的IP地址。 – user2319752 2013-04-26 11:06:19

+0

另外再看一遍,任何'a'標籤都不會將鏈接的末尾放在字符串末尾,所以' $'可能不是最好的搜索,而把函數的其餘部分放在函數中不會破壞任何東西(除非有進一步的php),這真的不是一個很好的解決方案。 – user2319752 2013-04-29 12:12:11