Как заменить ^ M новой строкой в ​​perl - PullRequest
4 голосов
/ 24 августа 2011

Мой тестовый файл имеет «n» строк и между каждой строкой есть ^ M, что, в свою очередь, делает его одной большой строкой.Код, с которым я работаю, открывает указанный файл и должен проанализировать заголовок, а затем последующие строки, а затем выполнить поиск пути к каталогу и имени файла.Но поскольку файл просто заканчивается как большая строка, он не работает правильно

#!/usr/bin/perl
#use strict;
#use warnings;

open  (DATA, "<file.txt") or die ("Unable to open file");

my $search_string = "Directory Path";
my $column_search = "Filename";
my $header =  <DATA>;
my @header_titles = split /\t/, $header;
my $extract_col = 0;
my $col_search = 0;

for my $header_line (@header_titles) {
  last if $header_line =~ m/$search_string/;
  $extract_col++;
}
for my $header_line (@header_titles) {
  last if $header_line =~m/$column_search/;
  $col_search++;
}

print "Extracting column $extract_col $search_string\n";

while ( my $row = <DATA> ) {
  last unless $row =~ /\S/;
  chomp $row;
  my @cells = split /\t/, $row;
 $cells[74]=~s/:/\//g;
$cells[$extract_col]= $cells[74] . $cells[$col_search];
print "$cells[$extract_col] \n";

}

Когда я открываю тестовый файл в VI, я использовал

:%s/^M/\r/g

, и это удаляет^ М, но как мне сделать это внутри этой Perl-программы?Когда я попробовал тестовую программу и вставил s\^M/\r/g и записал ее в другой файл, он появился как много китайских символов.

Ответы [ 5 ]

4 голосов
/ 24 августа 2011

Если mac2unix не работает для вас, вы можете написать свой собственный mac2unix в виде однострочного Perl:

perl -pi -e 'tr/\r/\n/' file.txt

Это может привести к ошибке, если размер файла больше, чем виртуальная память, хотя, так как он читает весь файл в память.

Для полноты давайте также имеем dos2unix:

perl -pi -e 'tr/\r//d' file.txt

и unix2dos:

perl -pi -e 's/\n/\r\n/g' file.txt
4 голосов
/ 24 августа 2011

Прежде чем начать чтение файла, установите $/ на "\r". По умолчанию это символ перевода строки, который подходит для концов строк в стиле UNIX и почти подходит для концов строк в стиле DOS, но бесполезен для старых концов линий в стиле Mac, которые вы видите. Вы также можете попробовать mac2unix для входного файла, если он у вас установлен.

Для получения дополнительной информации ищите «INPUT_RECORD_SEPARATOR» в справочной странице perlvar .

0 голосов
/ 05 ноября 2013

perl -MExtUtils :: Команда -e файл dos2unix

0 голосов
/ 24 августа 2011

Возможно, вы захотите установить $ \ (входной разделитель записей) на ^ M в начале вашего скрипта, например:

$\ = "^M";
0 голосов
/ 24 августа 2011

Создан ли этот файл в системе Windows?Если это так, попробуйте выполнить команду dos2unix для файла перед его чтением.Вы можете сделать это перед вызовом скрипта perl или внутри скрипта, прежде чем читать его.

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