Удаление CRLF (0D 0A) от строки в Perl

У меня есть сценарий Perl, который использует XML-файл на Linux и иногда существуют CRLF (Преобразуйте в шестнадцатеричную систему 0D0A, новые строки DOS) в некоторых значениях узла, который.

Система, которая производит XML-файл, пишет все это как одну строку, и выглядит, как будто это иногда решает, что это слишком длинно и пишет CRLF в один из элементов данных. К сожалению, нет ничего, что я могу сделать об обеспечивающей системе.

Я просто должен удалить их из строки, прежде чем я обработаю ее.

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

Я даже выполнил входной файл через dos2unix прежде, чем обработать, и я все еще не могу избавиться от ошибочных символов.

У кого-либо есть какие-либо идеи?

Большое спасибо,

7
задан HeHasMoments 2 July 2010 в 15:14
поделиться

3 ответа

Обычно. После двухчасового боя я решил его в течение 5 минут после того, как задал вопрос.

$output =~ s/[\x0A\x0D]//g; 

Наконец-то получил.

17
ответ дан 6 December 2019 в 07:24
поделиться
$output =~ tr/\x{d}\x{a}//d;

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

$output =~ s/\s+\z//;
6
ответ дан 6 December 2019 в 07:24
поделиться

Несколько вариантов:
1. Замените все вхождения cr / lf на lf: $ output = ~ s / \ r \ n / \ n / g; # вместо \ r \ n можно использовать \ 012 \ 015
2. Удалите все завершающие пробелы: output = ~ s / \ s + $ // g;
3. Хлюпать и раскалывать:

#!/usr/bin/perl -w  

use strict;  
use LWP::Simple;  

   sub main{  
      createfile();  
      outputfile();
   }

   main();

   sub createfile{
      (my $file = $0)=~ s/\.pl/\.txt/;

      open my $fh, ">", $file;
         print $fh "1\n2\r\n3\n4\r\n5";
      close $fh;
   }

   sub outputfile{
      (my $filei = $0)=~ s/\.pl/\.txt/;
      (my $fileo = $0)=~ s/\.pl/out\.txt/;

      open my $fin, "<", $filei;
         local $/;                                # slurp the file
         my $text = <$fin>;                       # store the text
         my @text = split(/(?:\r\n|\n)/, $text);  # split on dos or unix newlines
      close $fin;

      local $" = ", ";                            # change array scalar separator
      open my $fout, ">", $fileo;
         print $fout "@text";                     # should output numbers separated by comma space
      close $fout;
   }
1
ответ дан 6 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: