2013-08-01 13 views
0

我有一個包含以下數據的文本文件 INPUTPerl的 - 需要複製唯一的函數名

ChainCtrlBuildChain() : ChainController.c 
ChainCtrlDumpChain() : ChainController.c 
ChainCtrlDumpChanCallback() : ChainController.c 
ChainCtrlExit() : ChainController.c 
ChainCtrlGetBitStreamChan() : ChainController.c 
ChainCtrlInit() : ChainController.c 

我只想函數名複製到另一個文本文件。

輸出的必需

ChainCtrlBuildChain 
ChainCtrlDumpChain 
ChainCtrlDumpChanCallback 
ChainCtrlExit 
ChainCtrlGetBitStreamChan 
ChainCtrlInit 

通過使用user4035代碼

$text =~ s/\s:\s.*//g; 

我 「()」 函數以外的身體像

ChainCtrlBuildChain() 
ChainCtrlDumpChain()  

任何tips.how我能做到這一點。

我需要製作一個通用代碼因爲功能名稱和類名將根據用戶輸入而有所不同。

回答

3
perl -p -e 's/\(.*//' input.file 

查找左括號及其後的任何內容,並將其全部刪除。 -p表示逐行讀取輸入文件參數或標準輸入,並且在每行之後,在執行-e選項的參數中的腳本之後,打印$_的剩餘部分。

+0

感謝help.I是新來的Perl和試圖瞭解正則表達式。 –

0

你可以使用split,讓您輸入所需部分:

perl -ne 'print +(split(/\(/))[0] . "\n";' inputfile 
+0

雖然這會起作用,但我認爲這不是一種非常習慣的寫作方式。 –

1

它捕獲從每一行,並打印出來第一個字符串,

perl -nE 'say /(\w+)/' file 

在情況下也有類名方法名稱前(即class::method

perl -nE 'say /([^()]+)/x' file 
+0

這對於示例數據很好,但評論表明也可能有類名稱,所以可能會出現諸如'SomeClass :: MemberFunction()'等名稱,在這種情況下,這會丟失重要信息。 –

+0

這也是很好的方式來做incase類::方法來。 –

0
perl -lne 'print $1 if(/(.*)\(\)/)' your_file 

或AWK:

awk -F"\(" '{print $1}' your_file 

測試下面:

> perl -lne 'print $1 if(/(.*)\(\)/)' temp 
ChainCtrlBuildChain 
ChainCtrlDumpChain 
ChainCtrlDumpChanCallback 
ChainCtrlExit 
ChainCtrlGetBitStreamChan 
ChainCtrlInit 
> awk -F"\(" '{print $1}' temp 
ChainCtrlBuildChain 
ChainCtrlDumpChain 
ChainCtrlDumpChanCallback 
ChainCtrlExit 
ChainCtrlGetBitStreamChan 
ChainCtrlInit 
> 
+0

或許對Perl非貪婪的正則表達式,並在輸出中使用換行符 –