2011-02-25 12 views
0

我試圖找到JavaScript函數的名稱和插入下面的代碼JavaScript的正則表達式操作的功能

var functionName = arguments.callee.toString().substr('function '.length); 
functionName = functionName .substr(0,functionName .indexOf('(')); 
console.log(functionName); 

這將函數的名稱寫到控制檯,因爲它的調用。我沒有太多運氣。我一直想的這個變種sed.exe:

sed "{/function/ s/$/\var ownName = arguments.callee.toString().substr('function '.length);ownName = ownName.substr(0,ownName.indexOf('('));console.log(ownName);/}" *.js 

這只是在格式sed "/elephant/ s/$/\&castle" *.js

任何人有任何想法如何,我可以送什麼我追加到下一行,而比在功能相同的線?另外,我怎樣才能避免以下(但在sed.exe中)以避免匿名函數和eval函數?

grep -Eho "^s*function w+" *.js | sort 

感謝您的幫助。

+2

要注意的是'#功能不toString' ** **不返回一定的功能(ESP無法在手機上的瀏覽器),也從未被標準化的字符串版本。另外請注意,在某些瀏覽器上使用'arguments.callee'會顯着降低您的代碼*。 (大幅度提高10倍)。只要您意識到問題,就可以使用調試工具。 – 2011-02-25 23:08:12

+1

請記住,JavaScript太複雜,無法用正則表達式完美解析,儘管您可以想出一些「足夠好」的工作。 – 2011-02-25 23:10:43

回答

0

\n添加到用於GNU sed的替換字符串中。我將grep的正則表達式更改爲^[[:blank:]]*function \w\+ for sed,並將您的s語句的條件更改爲該語句,並且它正常工作。下面是在bash語法整個命令:

sed "/^[[:blank:]]*function \\w\\+/ s/\$/\\nvar ownName = arguments.callee.toString().substr('function '.length);\\nownName = ownName.substr(0,ownName.indexOf('('));\\nconsole.log(ownName);\\n/" *.js 
+0

'sed'不理解'\ s',所以你需要使用'[[:blank:]]',並且你在新行上缺少一個額外的反斜槓。作爲所有轉義的替代方法,您可以在整個文件中使用單引號,而在替換文本中使用'\ x27'而不是單引號。順便說一下,這不是Bash語法。同樣的命令幾乎可以在任何shell中運行。該語法特定於'sed'。 – 2011-02-26 01:48:42

+0

@丹尼斯:我修正了''s''並且缺少轉義錯誤;自最初的RE以來,我使用了雙引號。事實證明,這個語法是特定於GNU sed的;我說這是bash語法,因爲它在tcsh中不起作用。它可能適用於任何非csh shell。 – 2011-02-26 03:05:32