2014-12-04 2 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' в опции поможет? –

+0

Когда вы говорите «Это ничего не печатает», вы имеете в виду, что на самом деле ничего не печатает? Потому что это работает для меня. Или вы имели в виду, что вы получаете ошибку или что-то еще, что не «ничего». – TLP

+0

@ Джонатан: Это действительно работало. Посмотрел '-l', кажется, просто добавляет новую строку. Пробовал просто поставить новую строку в заявлении печати, и это сработало. – mtfurlan

ответ

4

У вас должно быть длинное приглашение. Более короткая подсказка выявила бы проблему.

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

Ваш файл имеет конца строки Windows (возврат каретки + перевод строки), и вы выводя возврат каретки без перевода строки, в результате чего линии будут перезаписаны.

Вы можете преобразовать файл в файл unix с помощью dos2unix или изменить свою программу для обработки окончаний строк 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

+0

На самом деле он имеет выход. Если я вывожу вывод 'command> science', а затем отредактирую файл, я увижу вывод с возвратом каретки. Но если я тогда 'cat' этот файл, никакого вывода еще раз. – mtfurlan

+0

Почему это так? В чем польза? – mtfurlan

Смежные вопросы