Как конвертировать ^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
буду работать