如何用perl中的新行替换^ M.

时间:2011-08-24 13:11:21

标签: perl

我的测试文件有“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

并删除了^ M,但我如何在这个perl程序中执行此操作?当我尝试一个测试程序并插入s\^M/\r/g并将其写入另一个文件时,它出现了很多中文字符。

5 个答案:

答案 0 :(得分:4)

在开始阅读文件之前,请将$/设为"\r"。默认情况下,它设置为换行符,这对于UNIX样式的行结尾很好,对于DOS样式的行结尾几乎没问题,但对于您看到的旧Mac样式的行结尾没用。如果安装了输入文件,也可以在输入文件上尝试mac2unix。

更多信息,请在the perlvar manpage中查找“INPUT_RECORD_SEPARATOR”。

答案 1 :(得分:4)

如果mac2unix不适合您,您可以将自己的mac2unix编写为Perl one-liner:

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

答案 2 :(得分:0)

此文件是否源自Windows系统?如果是这样,请在阅读之前尝试在文件上运行dos2unix命令。您可以在调用perl脚本之前或在脚本内部执行此操作之前阅读它。

答案 3 :(得分:0)

您可能希望在脚本开头将$ \(输入记录分隔符)设置为^ M,例如:

$\ = "^M";

答案 4 :(得分:0)

perl -MExtUtils :: Command -e dos2unix file