2014-07-15 60 views
0

我正在寫一個簡單的腳本,將網址指向Evernote筆記在線,並將它們轉換爲evernote:///協議。我正在使用的正則表達式正確匹配並修改了正確的URL,當我在正則表達式測試中試用(我使用OS X的模式)。但是,當我使用它與sed,它只是返回原始字符串。正則表達式轉換www.evernote.com網址使用evernote協議

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed 's#https?:_/_/www_.evernote_.com_/shard_/(..)_/nl_/(......)_/(.+_/)#evernote:_/_/_/view_/$2_/$1_/$3$3#'

知道爲什麼這是不工作?謝謝!

[編輯:如果任何人的興趣,這是一個鍵盤大師宏的AppleScript位:

set theURL to the clipboard set ENcode to "echo \"" & theURL & "\" | sed -E 's#https?://www.evernote.com/shard/(..)/nl/(.*)/(.+/)#evernote:///view/\\2/\\1/\\3\\3#' | pbcopy" do shell script ENcode

感謝@DreadPirateShawn幫我解決這個正則表達式。 ]

+0

你肯定你的正則表達式正常工作在正則表達式測試儀與所有這些下劃線? – devnull

+1

@devnull它的確如此,但你需要通過標誌來告訴它使用它們,就像其他系統一樣。 – Kevin

+1

@devnull它是OSX上的'-E'。 – Kevin

回答

0

使用擴展的正則表達式標誌-E,除去下劃線,並用\1代替每個$1圖案產生的官能正則表達式這裏:

$ echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed -E 's#https?://www\.evernote\.com/shard/(..)/nl/(......)/(.+/)#evernote:///view/\2/\1/\3\3#' 
evernote:///view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359/1875e55a-e512-4cf9-9b18-9e93c6a27359/ 

(確認在Ubuntu 12.04和OS X.)

如果您不使用-E,那麼您還需要將s?更改爲[s]?並轉義分組圓括號:

$ echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed 's#http[s]*://www\.evernote\.com/shard/\(.*\)/nl/\(.*\)/\(.*/\)#evernote:///view/\2/\1/\3\3#' 
evernote:///view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359/1875e55a-e512-4cf9-9b18-9e93c6a27359/ 

在後者例子,我也換成每(....)型序列與(.*) - 除非你是絕對肯定每個序列的長度(甚至那麼也許),該(.*)的做法將是一個更靈活一點。

+0

PS:不熟悉的evernote協議,我假設重複組3 - '$ 3 $ 3' - 是故意的 – DreadPirateShawn

+0

謝謝,我的最終版本是:'''echo「https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/」|/usr/local/bin/sed -E's#https?:\/\/www \ .evernote \ .com \/shard \ /(..)\/nl \ /(......)\ /(。+ \ )#evernote:\/\/\/view \/\ 2 \/\ 1 \ \ \ 3 \ 3#'''' – fort

+0

是的,輸出應該是這樣的:'''evernote:/// view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359/1875e55a-e512-4cf9-9b18-9e93c6a27359 /''' – fort

0

我想你想的:

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed -re 's#https://www.evernote.com/shard/(..)/nl/(......)/(.+)/#evernote://view/\2/\1/\3#' 
evernote://view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359 

製作沒有使用正則表達式擴展的:

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed 's#https://www.evernote.com/shard/\(..\)/nl/\(......\)/\(.\+\)/#evernote://view/\2/\1/\3#' 
evernote://view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359 
相關問題