2014-12-04 48 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