Добавить следующую строку в файл, когда текущая строка заканчивается ^ M - PullRequest
3 голосов
/ 12 декабря 2011

У меня есть файл, который выводится из инструмента (запрашивается из БД).В одном из полей есть символы ^ M в конце некоторых строк.Это приводит к повреждению моего вывода.Как добавить следующую строку к текущей строке, когда текущая строка заканчивается на ^ M.

На моей машине установлены sed, awk, perl, ruby ​​и python, и я использую bash.

Я попробовал следующее с использованием sed:

sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile

Но это помоглоне работает.

Пожалуйста, сообщите.

Спасибо, Картик С.

Ответы [ 4 ]

5 голосов
/ 12 декабря 2011

Символ ^ M, который вы видите, вероятно, на самом деле является возвратом каретки.Вы должны сопоставить те, которые используют \ r в регулярных выражениях.Данные, вероятно, вставляются в базу данных системой, которая использует CRLF в качестве окончания строки (скорее всего, для Windows), а не просто LF (как большинство систем * nix).Я предполагаю, что за ними уже стоит перевод строки, поэтому вы, вероятно, хотите удалить их, а не заменять их новой строкой.

Возможно, в вашей системе доступна команда dos2unix , которая может преобразоватьэти окончания строки для вас.

Вы, вероятно, хотите убедиться, что окончания строк согласованы в первую очередь с помощью dos2unix.После этого вы можете удалить символы новой строки следующим образом: cat infile | dos2unix | tr -d '\n' > outfile.Если вы хотите, чтобы место, где раньше были разрывы строк, вы можете использовать cat infile | dos2unix | tr '\n' ' ' > outfile.

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

1 голос
/ 12 декабря 2011

^M означает Ctrl + M, и это один символ, а не два. Когда вы делаете замену, вы вводите его как два символа или один?

Один символ: ctrl + v затем ctrl + m (правильно)

Два символа: ^ , затем M (неверно, но, вероятно, выглядит так же)

0 голосов
/ 07 сентября 2017

Чтобы понять, какие символы присутствуют в конце каждой строки моего файла, я использовал комментарии @potong:

sed -n 'l0' file
>>> 1st line\r$
>>> last line\r$

Мой файл заканчивался \r$ в каждой строке, поэтому я сделал:

sed -i "s/\r//g" file

, который избавился от \r (или ^M), переписав файл на месте.Вот результирующий отпечаток sed снова:

sed -n 'l0' file
>>> 1st line$
>>> last line$
0 голосов
/ 12 декабря 2011

Надеюсь, я правильно понял ваше требование.см. тест ниже:

файл с именем test :

abc^M
___2ndline


xyz^M
###2ndline again

note , который ^M я набрал в vim с помощью ctrl-v, ctrl-m

теперь смотрите вывод со следующей строкой awk.Я надеюсь, что это то, что вам нужно:

kent$  awk  '/^M/{gsub(/^M/,"");printf $0;next;}1' test
abc___2ndline


xyz###2ndline again
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...