Perl - убрать возврат каретки и добавить следующую строку - PullRequest
1 голос
/ 09 июля 2010

Что, если у меня есть запись в другом хорошем файле, в котором есть возврат каретки.

Пример:

1,2,3,4,5 ^M
,6,7,8,9,10

, и я хотел сделать ее

1,2,3,4,5,6,7,8,9,10

Ответы [ 6 ]

1 голос
/ 09 июля 2010

Допустим, у нас есть файл, содержащий Ctrl-M (на некоторых платформах \r):

$ cat input 
1,2,3
4,5,6
,7,8,9
10,11,12

Это явно с od:

$ od -c input 
0000000   1   ,   2   ,   3  \n   4   ,   5   ,   6  \r  \n   ,   7   ,
0000020   8   ,   9  \n   1   0   ,   1   1   ,   1   2  \n
0000035

Удалите каждый оскорбительный символ и соедините его строку со следующим, запустив

$ perl -pe 's/\cM\cJ?//g' input 
1,2,3
4,5,6,7,8,9
10,11,12

или перенаправить на новый файл с помощью

$ perl -pe 's/\cM\cJ?//g' input >updated-input

или перезаписать его на месте (плюс резервную копию в input.bak) с помощью

$ perl -i.bak -pe 's/\cM\cJ?//g' input

Установка опции \cJ опционально обрабатывает случай, когда файл заканчивается ctrl-M, но не ctrl-J.

1 голос
/ 09 июля 2010

В общем, если у вас есть строка с паразитной новой строкой в ​​конце, от которой вы хотите избавиться, вы можете использовать chomp (обратите внимание, что вы можете передать ей lvalue, так что оборачивать его вокруг задания допустимо):

my $string = $string2 = "blah\n";
chomp $string;

# this works too:
chomp(my $string3 = $string2);

Обратите внимание, что если строка имеет завершающий "\r\n", chomp также не будет принимать \r, если вы не измените $/.

Так что, если все это слишком сложно, и вам нужно удалить все вхождения \n, \r\n и \r (может быть, вы обрабатываете строки из разных архитектур одновременно)? может вернуться к старому доброму tr:

$string =~ tr/\r\n//d;
0 голосов
/ 10 июля 2010

Каждая строка заканчивается некоторой последовательностью терминатора, либо

  • CRLF (\ r \ n = 13, 10) в Windows / DOS
  • CR (\ n = 10)в Unix
  • LF (\ r = 13) в MacOS

Если с некоторыми строками все в порядке, вы должны сказать, из какой системы приходит файл или в какой системе выполняется скрипт perlили риск состоит в том, чтобы удалить каждый конец строки и объединить все строки вашей программы ...

Поскольку ^ M является символом LF, если вы видите такой символ в конце строки и ничего особенногос другой стороны, вы, вероятно, используете какой-то Unix (Linux?), и некоторые операции копирования / вставки загрязнили одну строку дополнительным \ r в конце строки.

, если это так:

perl -pi -e 's/\r\n$//g' filetomodify

выполнит трюк и объединит только строку, содержащую как CR, так и LF, со следующей строкой, оставив остальные строки без знака.

0 голосов
/ 10 июля 2010

Требуется дополнительная информация


Требуется больше информации о базовых данных и о том, как вы определяете carriage return. Данные в Linux или Windows? В самом деле, вы имеете в виду возврат каретки / перевод строки или просто перевод строки?


Некоторые опции:

  • $text =~ tr/\r//; & rarr; это самый быстрый способ отсеять возврат каретки
  • $text =~ tr/\n//; & rarr; это самый быстрый способ изменить перевод строки
  • $test =~ s/\n//s; & rarr; это, вероятно, то, что вы ищете, который делает текст в виде одной строки и удаляет внутренний
0 голосов
/ 09 июля 2010

Предполагая, что возврат каретки находится прямо перед переводом строки:

perl -pi.bak -e 's/\r\n//' your_file_name

Это объединит только строки с возвратом каретки в конце строки к следующей строке.

0 голосов
/ 09 июля 2010

s / [\ г \ п] // г

Делайте это, только если вы хотите объединить строку со следующей.

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