Удаление CRLF (0D 0A) из строки в Perl - PullRequest
7 голосов
/ 02 июля 2010

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

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

Мне просто нужно удалить их из строки перед обработкой.

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

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

У кого-нибудь есть идеи?

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

Ответы [ 3 ]

17 голосов
/ 02 июля 2010

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

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

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

6 голосов
/ 02 июля 2010
$output =~ tr/\x{d}\x{a}//d;

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

$output =~ s/\s+\z//;
1 голос
/ 03 июля 2010

Несколько вариантов:
1. Заменить все вхождения cr / lf на lf: $output =~ s/\r\n/\n/g; #instead of \r\n might want to use \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;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...