Как удалить символы новой строки из текстового файла?

116

У меня есть следующие данные, и мне нужно собрать их все в одну строку.

У меня есть это:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Мне это нужно:

22791;14336;22821;34653;21491;25522;33238;

РЕДАКТИРОВАТЬ

Ни одна из этих команд не работает идеально.

Большинство из них позволяют данным выглядеть так:

22791

;14336

;22821

;34653

;21491

;25522
Alucard
источник
15
Скопируйте и вставьте в адресную строку браузера или другое текстовое поле. Quick'n'dirty, но работает с небольшими объемами данных.
ignis

Ответы:

245
tr -d '\n' < yourfile.txt

Редактировать:

Если ни одна из представленных здесь команд не работает, значит, у вас есть что-то, кроме новой строки, разделяющей ваши поля. Возможно, у вас есть окончания строк DOS / Windows в файле (хотя я ожидаю, что решения Perl будут работать даже в этом случае)?

Пытаться:

tr -d "\n\r" < yourfile.txt

Если это не сработает, вам придется более внимательно изучить свой файл (например, в шестнадцатеричном редакторе), чтобы выяснить, какие символы на самом деле там находятся, которые вы хотите удалить.

Тайлер МакГенри
источник
7
Как записать этот вывод в тот же или другой файл?
StackOverflowOfficial,
3
Думаю trне подходит для пустых строк. Что вы думаете? - - Я думаю, что sedэто лучший вариант, описанный здесь stackoverflow.com/q/16414410/54964
Лео Леопольд Герц 준영
Чтобы направить вывод в другой файл, просто используйте перенаправление вывода. Чтобы направить его в тот же файл, направьте его в «sponge» (доступный в пакете «moreutils» в базовых системах Debian).
Plugwash
Чтобы записать вывод в тот же файл, используйте подоболочкуecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei
11
perl -p -i -e 's/\R//g;' filename

Должен делать свою работу.

ZYX
источник
Гольф вperl -pie 's/\R//g' filename
Трентон
9
paste -sd "" file.txt
Amardeep AC9MF
источник
1
В Solaris (10) paste -sd ""не работает на STDIN по умолчанию, поэтому, если вы (some command) | paste -sd "" -
подключаетесь
Это не сработает, если вы также хотите удалить последний символ новой строки. Он удаляет только промежуточные символы новой строки.
josch 01
Это не работало в Mac OS, версия Sundeep работала. paste -sd'\0' -
Трентон
7
tr -d '\n' < file.txt

Или

awk '{ printf "%s", $0 }' file.txt

Или

sed ':a;N;$!ba;s/\n//g' file.txt

Эта страница здесь есть куча других способов удаления переводов строк.

отредактирован, чтобы удалить насилие над кошками :)

Вивин Палиат
источник
4

использовать

head -n 1 filename | od -c 

чтобы понять, ЧТО является оскорбительным персонажем. затем используйте

tr -d '\n' <filename

для LF

tr -d '\r\n' <filename

для CRLF

MRE
источник
4

Вы можете отредактировать файл в vim:

$ vim inputfile
:%s/\n//g
loganaayahee
источник
2
и заменить пробелами::%s/\n/ /g
Реми Мелиссон
2

Использование man 1 ed:

# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
ed -s file <<< $'1,$j\n,p'  # print to stdout 
ed -s file <<< $'1,$j\nwq'  # in-place edit
Карлмунд
источник
2

Факт ботаника: вместо этого используйте ASCII.

tr -d '\012' < filename.extension   

(Отредактировано, потому что я не видел чертовского ответа с таким же решением, единственная разница заключалась в том, что у меня был ASCII)

Бифьюнарн
источник
2

Используйте sed с классами POSIX

Это удалит все строки, содержащие только пробелы (пробелы и табуляции)

sed '/^[[:space:]]*$/d'

Просто возьмите то, с чем вы работаете, и подключите его к этому

пример

cat filename | sed '/^[[:space:]]*$/d'

jasonleonhard
источник
sed -i '/ ^ [[: space:]] * $ / d' имя_файла ... для редактирования на месте; ответ, как указано выше, будет
выведен
1
$ perl -0777 -pe 's / \ n + // g' вход> выход
$ perl -0777 -pe 'tr / \ n // d' ввод> вывод
Грег Бэкон
источник
1

Если данные находятся в файле file.txt, то:

echo $(<file.txt) | tr -d ' '

' $(<file.txt)' Читает файл и выдает его содержимое в виде серии слов, которые затем повторяются эхом с пробелом между ними. Затем команда 'tr' удаляет все пробелы:

22791;14336;22821;34653;21491;25522;33238;
Джонатан Леффлер
источник
Это работает до тех пор, пока ввод не слишком большой и пока вы используете Bash (помеченный для Bash, так что все в порядке). Если бы я писал ответ сейчас, это было бы tr -d '\n' < file.txt, что и делает принятый ответ (и я удивлен, что не написал его в то время). Вероятно, это было написано просто, чтобы показать «еще один способ сделать это».
Джонатан Леффлер
1

xargs также потребляет символы новой строки (но добавляет последний завершающий символ новой строки):

xargs < file.txt | tr -d ' '
Marky
источник
1

Предполагая, что вы хотите сохранить только цифры и точки с запятой, следующее должно помочь при условии, что нет серьезных проблем с кодировкой, хотя оно также удалит самую последнюю «новую строку»:

$ tr -cd ";0-9"

Вы можете легко изменить приведенное выше, чтобы включить другие символы, например, если вы хотите сохранить десятичные точки, запятые и т. Д.

вершина горы
источник
1

Использование текстового редактора gedit (3.18.3)

  1. Нажмите Search
  2. Щелкните Найти и заменить ...
  3. Войдите \n\sв поле поиска
  4. Оставьте поле "Заменить" пустым (ничего)
  5. Установите флажок " Регулярное выражение"
  6. Нажмите Find кнопку

Примечание: это не совсем решает исходную 7-летнюю проблему OP, но должно помочь некоторым пользователям Linux-новичкам (например, мне), которые находят путь сюда из SE с аналогичными вопросами «как мне получить весь мой текст в одной строке» .

Хастиг Зусамменстеллен
источник
1

Был такой же случай сегодня, супер просто в vim или nvim, вы можете использовать gJдля соединения строк. Для вашего случая использования просто сделайте

99gJ

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

Леон - Хан Ли
источник
0

Я бы сделал это с помощью awk, например

awk '/[0-9]+/ { a = a $0 ";" } END { print a }' file.txt

(недостаток - "накапливается" в памяти).

РЕДАКТИРОВАТЬ

Забыл про printf! Поэтому также

awk '/[0-9]+/ { printf "%s;", $0 }' file.txt

или, вероятно, лучше, то, что уже было дано в других ответах, использующих awk.

ShinTakezou
источник
0

Я обычно получаю этот вариант использования, когда копирую фрагмент кода из файла и хочу вставить его в консоль, не добавляя ненужных новых строк, в итоге я сделал псевдоним bash
(я назвал его, onelineесли вам интересно)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o читает мой буфер обмена

  • tr -d '\n' удаляет новые строки

  • tr -s ' ' удаляет повторяющиеся пробелы

  • xsel -b -i отправляет это обратно в буфер обмена

после этого я вставлял новое содержимое буфера обмена в строку в консоли или что-то еще.

Мохаммад Абу-Шади
источник
0

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

  • открыто gedit

  • Затем Ctrl+ H, затем введите Findтекстовое поле \nи в Replace withпустое место, затем заполните флажок Regular expressionи вуаля.

Эдуард Флоринеску
источник
0

Чтобы также удалить завершающую новую строку в конце файла

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
crizCraig
источник