Как заменить несколько новых строк на одну с регулярными выражениями Perl? - PullRequest
6 голосов
/ 27 мая 2010

У меня есть документ, содержащий пустые строки (\ n \ n). Их можно удалить с помощью sed:

echo $'a\n\nb'|sed -e '/^$/d'

Но как мне сделать это с обычным регулярным выражением в perl? Что-то вроде следующего просто не дает никакого результата.

echo $'a\n\nb'|perl -p -e 's/\n\n/\n/s'

Ответы [ 3 ]

13 голосов
/ 27 мая 2010

Вам нужно использовать s/^\n\z//. Ввод читается построчно, поэтому вы никогда не получите более одной новой строки. Вместо этого удалите строки, которые не содержат никаких других символов. Вы должны вызвать perl, используя

perl -ne 's/^\n\z//; print'

Нет необходимости в переключателе /s.

6 голосов
/ 27 мая 2010

Более узкая проблема отсутствия печати пустых строк более проста:

$(input) | perl -ne 'print if /\S/' 

выведет все строки, кроме тех, которые содержат только пробелы.

3 голосов
/ 27 мая 2010

Входные данные состоят из трех отдельных строк, а perl с опцией -p обрабатывает только одну строку за раз.

Обходной путь - это сказать perl, чтобы он хлестал сразу несколько строк ввода. Один из способов сделать это:

echo $'a\n\nb' | perl -pe 'BEGIN{$/=undef}; s/\n\n/\n/'

Здесь $/ - это переменная-разделитель записей , которая сообщает Perl, как разбирать входной поток на строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...