найти и заменить двойные символы новой строки на Perl? - PullRequest
5 голосов
/ 21 августа 2010

Я очищаю некоторые веб-страницы, которые по некоторым причинам имеют около 8 разрывов строк между тегами.Я хотел удалить большинство из них, и я попробовал это

perl -pi -w -e "s/\n\n//g" *.html

Но не повезло.Для хорошей меры я попытался

perl -pi -w -e "s/\n//g" *.html

, и это действительно удалило все мои разрывы строк.Что я делаю не так?

edit Я тоже пробовал \r\n\r\n, такая же сделка.Работает как разрывы одной строки, ничего не делает два последовательных.

Ответы [ 2 ]

19 голосов
/ 21 августа 2010

Использование -0:

perl -pi -0 -w -e "s/\n\n//g" *.html

Проблема в том, что по умолчанию -p читает файл по одной строке за раз. Там нет такой вещи, как строка с двумя символами новой строки, поэтому вы не нашли ни одной. -0 меняет символ конца строки на "\0", который, вероятно, не существует в вашем файле, поэтому он обрабатывает весь файл одновременно. (Даже если файл содержит NUL, вы ищете последовательные символы новой строки, поэтому обработка его в разделенных NUL кусках не будет проблемой.)

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

Если файл очень большой, у вас может не хватить памяти для загрузки его в один фрагмент. Обходной путь для этого состоит в том, чтобы выбрать какой-нибудь символ, который является достаточно распространенным, чтобы разбить файл на управляемые куски, и сказать Perl, чтобы использовать его в качестве символа конца строки. Но это также должен быть персонаж, который не появится в матчах, которые вы пытаетесь заменить. Например, -0x2e разделит файл на "." (ASCII 0x2E).

5 голосов
/ 28 февраля 2012

Я пытался заменить двойной символ новой строки одним, используя приведенную выше рекомендацию для большого файла (2,3 ГБ). С большими файлами это вызовет ошибку при попытке прочитать весь файл сразу.Поэтому вместо поиска двойной новой строки просто найдите строки, где единственным символом является новая строка:

perl -pi -w -e 's/^\n$//' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...