2016-06-14 23 views
1

пытался удалить ошибочные символы новой строки, созданные из 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', все не сработало. У кого-нибудь есть идея, как это сделать правильно?

+1

Почему на выходе после строки 'bar' нет' ''? это любой другой символ пробела? Или это просто опечатка? – anishsane

+0

@anishsane жаль, что это опечатка, и я ее исправил. – galactica

ответ

1

я копировал свой файл примера, как:

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

Вы можете использовать Perl в режиме 'Глоток' делать:

$ 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 

а ...

+0

Я предполагаю, что это -0777 - gulp 'режим? Если это так, мы не должны этого делать, потому что я упоминал, что это огромный файл, который мне нужно обработать (> 5 ГБ). Во всяком случае, ваше предложение работает, но я немного удивлен, что нет инструмента командной строки, который может справиться с этим аккуратно. – galactica

+0

Perl и ваша ОС будут обрабатывать огромный файл разумно, даже если он намного больше, чем память хоста. Попробуй. – dawg

+0

Я сделал, и это дало мне ошибку ошибки сегментации при добавлении -0777 на CentOS 6, вот почему я прокомментировал выше – galactica

0

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

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

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

+0

Это не удалит * все * новые строки? –

+0

В соответствии с вопросом * без каких-либо новых строк между * –

+0

Но вопрос также упоминает «огромный файл» ... Интересно, действительно ли ОП хочет, чтобы его файл был как одна строка. –

1

Использование 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>

+0

Спасибо за фрагмент и объяснения! Это работает! – galactica

+0

Он масштабируется для огромного размера файла, как вы хотите? – anishsane

+0

Да, он очень хорошо масштабируется. Благодаря! – galactica

 Смежные вопросы

  • Нет связанных вопросов^_^