2014-12-04 49 views
-1

所以我需要通過一些java文件,每一個@author標籤之後拉出作者。我開始看awk,但awk無法刪除無用的部分,所以我碰到了this

我正在運行

perl -n -e'/author (.*)/ && print $1' *.java 

這將打印什麼。如果我做

perl -n -e'/author (.*)/ && print $_' *.java 

它會(正確)打印整條線。

我能做到這一點,它也完成我的目標,但我還是想知道爲什麼我的捕獲組不能正常工作。

perl -n -e"/\@author/&& print $'" *.java 

例輸入:

/* HelloWorld.java 
* @author Partner of Winning 
* @author Robert LastName 
*/ 

public class HelloWorld{ 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
    } 
} 

非常感謝任何幫助。

+3

一個區別是'$ _'以換行符結束,但$ 1'不結束。也許在選項中加入'-l'會有幫助嗎? – 2014-12-04 15:19:18

+0

當你說「這不會打印任何東西」時,你的意思是它實際上不打印任何東西?因爲它適合我。或者你的意思是你得到了一個錯誤,或者其他什麼都不是「無」。 – TLP 2014-12-04 15:21:05

+0

@Jonathan:這確實奏效。看起來'-l',似乎只是添加一個換行符。試圖在打印聲明中添加一個換行符,這也起作用。 – mtfurlan 2014-12-04 15:24:00

回答

4

你必須有一個很長的提示。較短的提示會揭示出問題。

$ perl -n -e'/author (.*)/ && print $1' *.java 
$ bert LastNameing 

您的文件的Windows行尾(回車+換行),而你不輸出換行回車,導致線路被覆蓋。

您可以將文件轉換爲使用dos2unix UNIX文件,或者你可以改變你的程序來處理CRLF行結束。有幾個捷徑可以在這裏使用。

添加換行符,有效地中和CR。

$ perl -nle'/author (.*)/ && print $1' *.java 
Robert LastName 
Partner of Winning 

但是可以輸出導致問題的文本,因爲它仍然包含輸入的CR。下面避免匹配它們:

$ perl -nle'/author ([^\r\n]*)/ && print $1' *.java 
Robert LastName 
Partner of Winning 
+0

我能找到不是在代碼或數據的差異,我複製到兩者的帖子,我都抄回試它,但它仍然沒有打印。然而,換行符確實修復了它。 – mtfurlan 2014-12-04 15:28:26

+0

它實際上有輸出。如果我輸出輸出'命令>科學'然後編輯文件,我可以看到輸出,回車符。但是如果我然後'貓'那個文件,不再輸出。 – mtfurlan 2014-12-04 15:35:07

+0

它爲什麼這樣做?有什麼好處? – mtfurlan 2014-12-04 15:38:10