Perl (или что-то еще) - ^ M проблема - PullRequest
0 голосов
/ 03 декабря 2009

Я пытаюсь добавить " в начале и ", в конце каждой непустой строки текстового файла в Perl.

perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt

Добавляет " в начале каждой непустой строки, но у меня проблема с ",.

Пример ввода:

bla
bla bla
blah

Это вывод, который я получаю:

"bla
",
"bla bla
",
"blah
",

И это вывод, который я действительно хочу :

"bla",
"bla bla",
"blah",

Как мне это исправить?

Edit: Теперь я открыл свой выходной файл в vim (раньше я его открывал в kwrite, чтобы он не был виден) и заметил, что vim показывает ^M перед каждым ", - я не знаю, что в коде добавляет это.

Ответы [ 5 ]

5 голосов
/ 03 декабря 2009

Похоже, проблема с окончанием строки - вы редактировали файл в Windows? Попробуйте dos2unix

Если вы не хотите использовать dos2unix, вы можете сопоставить \ r:

perl -pi -e 's/^(.+)\r$/\"$1\",/g'

Проблема в том, что если у вас есть возврат в файле, он будет соответствовать им. * Так что вы получите:

"bla^M",
"bla bla^M",
"blah^M",
2 голосов
/ 03 декабря 2009

Ваш файл данных должен быть создан в Windows, которая использует CRLF в качестве разделителя строк, а не просто LF. Это означает, что ваш текстовый файл выглядит так:

bla[CR][LF]bla bla[CR][LF]blah[CR][LF]

Вы можете проверить это с помощью od -c something.txt.

$ od -c something.txt
0000000    b   l   a  \r  \n   b   l   a       b   l   a  \r  \n   b   l
0000020    a   h  \r  \n                                                
0000024

В Unix или Linux это будет выглядеть так:

bla\r
bla bla\r
blah\r

Когда perl выполняет подстановку, это приводит к следующему:

"bla\r",
"bla bla\r",
"blah\r",

И когда вы видите результат, вы получаете то, что видите:

"bla
",
"bla bla
",
"blah
",

Самое простое, что нужно сделать - это использовать dos2unix для преобразования концов строк в формат Unix, тогда ваши скрипты будут вести себя как положено.

1 голос
/ 03 декабря 2009

В системах, использующих текстовые файлы CRLF, Perl использует IO-слой для фильтрации CRLF, так что мы видим только LF в наших скриптах. Однако если вы откроете файл CRLF в системе, в которой CRLF не используется нормально, вы можете включить преобразование CRLF несколькими способами.

Вы можете использовать binmode . Я использую интерфейс OO здесь, потому что я думаю, что он чище, YMMV:

use IO::File;

open( my $fh, '<', 'winfile.txt' ) 
    or die "Oh poo - $!\n";

$fh->binmode(':crlf');

Вы также можете использовать тонкое открытие:

open( my $fh, '<:crlf', 'winfile.txt' ) 
    or die "Oh poo - $!\n";

Или для однострочной вы можете установить переменную окружения PERLIO (см. PerlIO ):

PERLIO=crlf perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt

Конечно, этот подход сохранит окончания строк CRLF в обработанном файле - что может быть или не быть тем, что вы хотите.

0 голосов
/ 03 декабря 2009

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

perl -ne 'chomp;print "\"".$_."\",\n"' file
0 голосов
/ 03 декабря 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...