Как конвертировать ^M$ newline из dos в unix (dos2unix не работает)

Пытался удалить ошибочные символы новой строки, сгенерированные из Windows.

$cat -e file.xml
foo^M$
bar$
$
hello world1$
hello world2$

где должен быть "foobar" без каких-либо новых строк, в то время как все новые строки должны быть сохранены. Я знаю, что в emacs мы могли бы заменить "^M^J" на "RET", но у меня есть огромный файл, который я не хочу открывать, но хотел использовать только командную строку для его преобразования.

Я старался dos2unix но он только удалил часть "^M", по-прежнему отображая неработающее слово / предложение. Также попробовал tr -d '\r' а также sed 's:^M$::g' или же sed 's:^M$\n:\n:g'все не сработало. У кого-нибудь есть идеи, как это сделать правильно?

3 ответа

Решение

Я скопировал ваш файл примера:

$ cat -e so.txt
foo^M$
bar$
line2$
line3$

Вы можете использовать Perl в режиме 'gulp', чтобы сделать:

$ perl -0777 -pe 's/\r\n//g' so.txt
foobar
line2
line3

Проблема с использованием большинства линейно-ориентированных подходов заключается в \r\n читается как строка.


Ты можешь сделать:

$ perl -pe 's/\r\n//' /tmp/so.txt
foobar
line2
line3

также...

С помощью awk:

$ cat -e so.txt
foo^M$
bar$
line2$
line3$

$ awk 1 RS=$'\r\n' ORS= so.txt
foobar
line2
line3

$ awk 1 RS=$'\r\n' ORS= so.txt | cat -e # Just for verification
foobar$
line2$
line3$

Он устанавливает разделитель записей в \r\n & печатает записи с ORS=<empty string>

Возможно следующее будет работать

sed -e 's/[\n\r]//g' old_file.txt > new_file.txt

буду работать

Другие вопросы по тегам