2016-12-13 68 views
0

我的Linux存儲庫文件包含一個鏈接,該鏈接目前使用的是帶端口號的http來指向它的存儲庫。如何使用sed編輯url字符串

的BaseURL = http://host.domain.com:123/folder1/folder2

我現在需要一種方法來替換URL使用https沒有端口或不同的端口。 我還需要將服務器名稱從host.domain.com更改爲host2.domain.com的可能性

所以我的想法是使用sed搜索http的開頭,直到第一個/在2 //之後捕獲其中的任何內容,並使我能夠更改服務器名稱端口或http的用法。

林現在使用此代碼(使用回波即時通訊只是爲示例):

的例子示出了如何2例,其中一個時間我有一個鏈接http和端口123轉換爲https和第二時間的其他方式 和這兩個代碼我一般使用相同的sed原因。

WANTED_URL="https://host.domain.com" 
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

OR

WANTED_URL="http://host.domain.com:123" 
echo 'https://host.domain.com/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

是正確的方式這樣做?

+0

就是爲什麼我要抓住它,直到正斜槓,並從HTTP,所以我總是需要只添加完整的URL(有或無端口) –

+0

既沒有答案的爲你工作? –

+0

是兩種方式都可以 –

回答

2

sed正則表達式默認爲貪婪。你可以告訴sed消耗唯一的非斜線,這樣的:

echo 'http://host.domain.com:123/folder1/folder2' | sed -e 's|http://[^/]*|https://host.domain.com|' 

結果:

https://host.domain.com/folder1/folder2 

(順便說一句,你不必逃避,因爲你使用的是備用分隔符斜槓)

的關鍵是使用[^/]*所以它停靠在第一個斜槓(非貪婪)匹配,這將匹配任何斜線。

您使用/.*/.*可以包含斜線,不是說你想(通過默認的貪婪)。

無論如何,我的方法是不同的,因爲表達式不包括尾部斜槓,所以它不會從最終輸出中刪除。

+0

是works.canü請解釋[^ /] * –

+0

編輯瞭解更多詳情。 –

+1

@EdMorton沒關係,編輯。請注意,我不會在我的答案中使用它。我儘可能簡單地喜歡它,總是在我的多功能工作站上使用1975 -'sed'檢查我的答案(只是開玩笑:)) –

1

假設這並不重要,如果你有1個sed腳本或者2並沒有一個很好的理由進行硬編碼的URL:

$ echo 'http://host.domain.com:123/folder1/folder2' | 
    sed 's|\(:[^:]*\)[^/]*|s\1|' 
https://host.domain.com/folder1/folder2 

$ port='123'; echo 'https://host.domain.com/folder1/folder2' | 
    sed 's|s\(://[^/]*\)|\1:'"$port"'|' 
http://host.domain.com:123/folder1/folder2 

如果這不是你所需要的,然後編輯你的問題,以澄清您的要求,尤其是解釋爲什麼:

  1. 您要使用硬編碼的網址,並
  2. 您需要1個腳本來完成這兩個轉變。

和提供簡潔,可測試的樣本輸入和預期輸出演示這些需求(即情況下上述不工作)。

WRT,你有什麼:

WANTED_URL="https://host.domain.com" 
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

的主要問題是:

  1. 不要使用全大寫的對非出口的shell變量名,以避免與出口變量衝突,避免混淆你的代碼(這個約定已經存在了40年,所以人們期望所有的大寫變量都被導出)。
  2. 因爲你想看到的,即使它來執行命令之前暴露了整個腳本給shell解釋決不用雙引號括任何腳本。而不是僅僅開闢各地最小的腳本段可能的單引號在必要的時候,也就是在腳本中使用cmd 'x'"$y"'z'cmd "x${y}z"擴大$y因爲後者將失敗含糊和危險的各種輸入的,腳本文本,環境設置和/或內容您從中運行它的目錄。
  3. -i選項sed的是編輯就地文件,你不能使用它進行傳入管,因爲你不能編輯就地管道。
  4. 當你讓一個shell變量擴大,成爲腳本的一部分,你必須要包含的關於可能的字符,以及他們如何會給出的變量擴展到環境的命令解釋照顧。如果您讓整個URL擴展到sed腳本的替換部分,那麼您必須小心,以便首先轉義任何可能的反向引用字符或腳本分隔符。見Is it possible to escape regex metacharacters reliably with sed。如果你只是讓端口號擴大,那麼你不必處理任何這些。