Как убрать возврат каретки в середине строки - PullRequest
1 голос
/ 21 мая 2011

У меня есть файл, который читается приложением в Unix и Windows.Однако я сталкиваюсь с проблемами при чтении в окнах с ^ M в середине данных.Я только хочу удалить ^ M в середине строк, таких как поле 4 и поле 5.

Я пытался использовать perl -pe 's/\cM\cJ?//g', но он удаляет все в одну строку, которая мне не нужна.Я хочу, чтобы данные оставались в одной строке, но удалите лишние

# Comment^M
# field1_header|field2_header|field3_header|field4_header|field5_header|field6_header^M
#^M
field1|field2|field3|fie^Mld4|fiel^Md5|field6^M
^M

Спасибо

Ответы [ 3 ]

1 голос
/ 21 мая 2011

Чтобы просто удалить CR в середине строки:

perl -pe 's/\r(?!\n)//g'

Вы также можете написать это perl -pe 's/\cM(?!\cJ)//g'.Конструкция ?! является отрицательным прогнозным выражением .Шаблон соответствует CR, но только если за ним не следует LF.

Конечно, если допустимо создание файла с символами новой строки unix, вы можете просто удалить все символы CR:

perl -pe 'tr/\015//d'

То, что вы написали, s/\cM\cJ?//g, лишает CR и LF после него, если оно есть, потому что LF является частью совпавшего шаблона.

0 голосов
/ 21 мая 2011
use strict;
use warnings;

my $a = "field1|field2|field3|fie^Mld4|fiel^Md5|field6^M";

$a =~ s/\^M(?!$)//g;

print $a;
0 голосов
/ 21 мая 2011

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

Я не уверен, каким должен быть символ ^M, но возврат каретки равен \015 или \r.Итак, s/\r//g должно хватить.Помните, что это также удаляет ваш последний возврат каретки, если это то, что вы хотите сохранить.

...