perl $ 1没有设定

时间:2014-12-04 15:15:19

标签: regex perl

所以我需要浏览一些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!");
    }
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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