2012-07-10 25 views
0

您好我想更換document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));如何使用sed替換以下文本?

(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();

在所有出現

...

所以我用這個下面的代碼。

find /cygdrive/c/xampp/htdocs/news -type f -exec sed -i s#document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));#(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();#g {} \; 

但它並沒有取代。轉義有什麼問題嗎?

感謝

+0

殼牌公司將擴大雙和單引號字符。你必須引用他們。 – fork0 2012-07-10 10:46:11

+0

此外,「。」 (點)在正則表達式中有特殊的含義。不過,在這個特殊情況下,這不太重要。 – fork0 2012-07-10 10:47:47

+0

@ fork0,這將無濟於事,shell也會分詞。這些空格需要轉義(或引用) – 2012-07-10 11:19:40

回答

1

您需要引用sed的參數,並轉義任何嵌套的引號。否則:

s#document.write(unescape("%3Cscript src='" + gaJsHost + ... 

將被shell分解成單獨的單詞,而不是作爲單個參數傳遞給sed。

您需要在引號中圍繞整個sed腳本(s#from#to#部分),我會選擇單引號,然後用\'替換腳本中的每個'

(另外,爲什麼您使用find -exec什麼,而不是我suggested?)

0

即使它不是一個直接的答案,這樣的替換,您可以使用「RPL」的工具。 它看起來像你正在使用cygwin,因此你可以找到一個win32端口here

1

sed -i「s/^ document.write(unescape(。*; $ /(function(){var ga = document.createElement('script'); ga.type ='text/javascript' ; ga.async = true; ga.src =('https:'== document.location.protocol?'https:// ssl':'http:// www')+'.google-analytics.com/ga的.js ';變種S = document.getElementsByTagName(' 腳本「)[0]; s.parentNode.insertBefore(GA,S);})(); /」 example.txt中

+0

爲了避免[傾斜牙籤綜合徵],爲什麼不使用不同的分隔符,例如's#a#b#'或's,a,b''(http://en.wikipedia.org /維基/ Leaning_toothpick_syndrome)? – 2012-07-10 11:18:28

+0

由於Javascript代碼經常有'#'或','它的某處,而且你必須逃避這一點..我同意你的一般情況,但我認爲在這種情況下,直接的方法可能是更容易理解。我發現記住要逃避'/'比記得爲其他角色這麼做更容易。 – Kuf 2012-07-10 11:36:14

+0

選擇一個不在字符串中的分隔符,並且不需要轉義任何東西。選擇一個經常出現在URL中的分隔符代替一些URL時,只會讓它比需要的更難。無論如何。 – 2012-07-10 11:54:19

1

那麼,所述第一步驟將單獨檢查sed命令:

bash:語法錯誤附近意想不到的令牌`('

您必須將sed命令放入單引號或雙引號,以便它作爲單個參數傳遞給sed應用程序's#docum....'。如果單引號內有單引號,或雙引號內有雙引號,則必須將其轉義。

注意,該命令將顯得相當難看,沒有真正可讀或維護的,我會用Python或Ruby,你有特殊的報價,這將有助於用繩子逃避的問題克服...