Как заменить символ новой строки (\ n) с помощью sed?

Как я могу заменить новую строку (\n) с помощью команды sed?

Я безуспешно пытался:

sed 's#\n# #g' file
sed 's#^$# #g' file

Как мне это исправить?

 Bernie Reiter28 мар. 2019 г., 12:46
@ Патрик Даркcat text.txt | echo $(tr "\012" " ") Круто :-) Спасибо за совет!
 anthony28 февр. 2017 г., 00:45
ВНИМАНИЕ: "тр» действует по-разному в отношении диапазонов символов между Linux и более старыми машинами Solaris (EG sol5.8). EG: `tr -d 'а-г» `и` tr -d '[A-Z]» `. Для этого я рекомендую использоватьСЕПГ» который неУ меня нет этой разницы.
 Angry 8431 дек. 2015 г., 03:47
tr является только правильным инструментом для задания, если заменить один символ для одного символа, в то время как в приведенном выше примере показано заменить символ новой строки пробелом. Так что в приведенном выше примере tr может работать .. Но будет ограничение позже.
 cp.engr19 янв. 2016 г., 20:08
@Mayhem,sed 's/$/ NewDelim/' | tr '\n' ' ', использованиеsed добавить новый разделитель в конец каждой строки, а затем удалитьtr, Менее загадочно, чемsed Единственный способ, ИМО.
 Mike S28 дек. 2016 г., 16:01
tr в правильном инструменте для работы, потому что спрашивающий хотел заменить каждую новую строку пробелом, как показано в его примере. Замена новых строк уникальна дляsed но легко сделатьtr, Это общий вопрос. Выполнение замен регулярных выражений не выполняетсяtr но поsed, который был бы правильным инструментом ... для другого вопроса. "
 Patrick Dark26 мар. 2019 г., 19:15
@BernieReiter Можно аккуратно смягчить окончательную проблему удаления новой строки, вызвавtr команда вecho командная оболочка:echo $(tr "\012" " ")
 Bernie Reiter29 дек. 2017 г., 00:30
@MikeS Спасибо за ответ. следитьtr '\012' ' ' сecho, В противном случае также будет удален последний перевод строки в файле.tr '\012' ' ' < filename; echoделает трюк.
 anthony28 февр. 2017 г., 00:44
тр» также можно просто удалить символ новой строки `tr -d '\ П» `однако вы также можете удалить возврат, чтобы быть более универсальным` tr -d '\ 012 \ 015' `.

Ответы на вопрос(30)

Кто нуждаетсяsed? Здесьbash путь:

cat test.txt |  while read line; do echo -n "$line "; done
 glenn jackman18 мар. 2015 г., 19:46
echo $(
 glenn jackman04 февр. 2016 г., 18:02
говоря, я бы нене ожидал$(
 Josip Rodin05 апр. 2016 г., 14:18
Вы также можете избежать башизмаecho -n используяprintf
 Juan04 февр. 2016 г., 17:05
@Ed ...$(
 wds19 окт. 2017 г., 09:26
Если вы неt IFS, я полагаю, это также удалит табуляции и последовательные пробелы?
 seumasmac07 февр. 2013 г., 17:03
@ Тони, потому что обратные пометки устарели, а кот избыточен ;-) Использование: echo $ (<days.txt)
 Ed Morton13 июн. 2015 г., 15:32
В дополнение к тому, что было запрошено, будут удалены все ведущие / обучающие пробелы и символы обратной косой черты. Не используйте циклы оболочки просто для манипулирования текстом, это всегда неправильный подход.
 Carlo Cannas20 янв. 2014 г., 18:42
Даже не используя:catwhile read line; do echo -n "$line "; done < test.txt, Может быть полезно, если проблема связана с вложенной оболочкой.
 Juan04 февр. 2016 г., 17:25
Эд ... Извините. Вы'верно, я имел в виду @glenn Джекман. Данг, пропустил окно редактирования комментария.
 Tony27 сент. 2012 г., 01:51
тогда почему бы и нет: echo -n `cat days.txt`Из этого поста
 Ed Morton04 февр. 2016 г., 17:13
@Juan idk, но я думаю, что вы пытаетесь обратиться к Гленну, я никогда не упоминал$(
 Vasiliy Sharapov09 февр. 2011 г., 18:34
Upvote, я обычно использовал верхний ответ, но когда он пропускал через него / dev / urandom, sed win 't печатать до EOF, а ^ C не EOF. Это решение печатает каждый раз, когда видит новую строку. Именно то, что мне было нужно! Спасибо!
tr '\n' ' ' 

Легко и просто использовать.

 spuder16 окт. 2014 г., 01:26
или простоtr -d '\n' если ты нене хочу добавлять пробел

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"
 kralyk03 сент. 2013 г., 15:28
Чувак, я понял. Не нужно втирать мне в лицо :-) ТорОтвет в любом случае выше на странице (что правильно), так что вас волнует?
 mschilli02 сент. 2013 г., 19:03
пожалуйста проверять, выписыватьсяТор»ответ вместо. Это намного эффективнее, удобочитаемее и простолучше во что бы то ни стало, чтобы сравнить этот подход (хотя этобыло бы Работа)!
 Dennis Williamson30 мар. 2012 г., 08:34
Ты неНе нужно избегать кавычек и знака доллара, если вы измените внешние на одинарные кавычки. Буква "о" Обычно считается неправильным выбором в качестве имени переменной, так как его можно спутать с цифрой «0», Вы также неВам не нужно инициализировать вашу переменную, по умолчанию это пустая строка. Однако, если вы нене хочу постороннего ведущего пространства:awk '{s = s sp $0; sp = " "} END {print s}', Тем не менее, смотрите мой ответ, чтобы узнать, как использовать awk без чтения всего файла в память.

используя tr для замены новой строки на вкладки, а затем заменяя вкладки тем, что я хочу. В этом случае, ""

 так как я'Я пытаюсь генерировать разрывы HTML.

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`

Чтобы удалить пустые строки:

sed -n "s/^$//;t;p;"
 Léo Léopold Hertz 준영08 июн. 2015 г., 22:29
Это для GNU Sed. В нормальном Sed это дает.sed: 1: "s/^$//;t;p;": undefined label ';p;'

если вы хотите заменить символы новой строки в файле, вы можете просто использовать dos2unix (или unix2dox)

dos2unix yourfile yourfile

    
 Peter Mortensen31 мар. 2015 г., 10:11
Можете ли вы добавить дополнительную информацию к своему ответу (ссылка может быть или не может быть достаточно)? Например. где нужно получить dos2unix? Это отдельная программа? Это часть большей упаковки? На каких платформах он работает (только Unix? Только Windows?)
 Michael Back26 нояб. 2015 г., 05:13
Это только избавляет от \ r - не \ n. Я все время использую sed для этого ...sed -i -e 's / \ г $ //» Foo является более надежным, чем эти инструменты для меня.

тр» Решение выше, на Windows (вероятно, с использованием версии tr Gnuwin32), предлагаемое решение:

tr '\n' ' ' < input

не работал для меня, этолибо ошибка, либо фактически заменить ш / '' по какой-то причине.

Используя другую особенность tr, "удалять" опция -d сработала, хотя:

tr -d '\n' < input

или же '\р' вместо ''

 user149181929 сент. 2017 г., 05:55
Нет, в подсистеме Ubuntu Windows 10 вам нужно использоватьtr "\n\r" " " < input.txt > output.txt
 Keith Thompson24 авг. 2011 г., 16:25
В Windows вам, вероятно, нужно использоватьtr "\n" " " < input, Оболочка Windows (cmd.exe) не работаетне относиться к апострофу как кавычки.
 Alchemistmatt14 июн. 2018 г., 01:15
Это работает в Windows 10 с использованием Gnuwin32:cat SourceFile.txt | tr --delete '\r\n' > OutputFile.txt , Или вместо Gnuwin32 используйте Gow (Gnu в Windows),github.com/bmatzelle/gow/wiki
sed '1h;1!H;$!d
     x;s/\n/ /g' YourFile

но очень эффективно, если для хранения файла достаточно памяти. (Исправление ->H 1h;1!H после хорошего замечания @hilojack)

Другая версия, которая меняет новую строку во время чтения (больше процессора, меньше памяти)

 sed ':loop
 $! N
 s/\n/ /
 t loop' YourFile
 NeronLeVelu19 июн. 2015 г., 13:29
правильно, исправление сделано
 Thor03 нояб. 2016 г., 20:14
Версия цикла похожа наэтот ответ и, как я отмечал в комментариях, это примерно в 800 раз медленнее.
 ahuigo19 июн. 2015 г., 11:59
Это не эффективно, как примерsed ':a;N;$!ba;s/\n/ /g', С другой стороны, вывод имеет дополнительный пробел

возможно, вы можете изменитьRS на другую строку или символ. Этот способ доступен для sub / gsub:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

Сила сценариев оболочки заключается в том, что если вы не знаете, как это сделать одним способом, вы можете сделать это другим способом. И во многих случаях вам нужно учитывать больше вещей, чем принимать комплексное решение простой проблемы.

Что касается того, что gawk работает медленно ... и читает файл в память, я этого не знаю, но мне кажется, что gawk работает с одной строкой одновременно и работает очень-очень быстро (не так быстро, как некоторые другие , но время для написания и тестирования также имеет значение).

Я обрабатываю МБ и даже ГБ данных, и единственное ограничение, которое я нашел, - это размер строки.

 Dennis Williamson30 мар. 2012 г., 08:35
Бесполезное использование.cat

Как заменить символ новой строки (\ n) с помощью sed?

... не работает в freebsd 7.2 в командной строке:

( echo foo ; echo bar ) | sed ':a;N;$!ba;s/\n/ /g'
sed: 1: ":a;N;$!ba;s/\n/ /g": unused label 'a;N;$!ba;s/\n/ /g'
foo
bar

Но если вы поместите скрипт sed в файл или используете -e для "строить» сценарий sed ...

> (echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g'
foo bar

или же ...

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

Возможно, sed в OS X похож.

 JamesG07 сент. 2011 г., 21:26
Ряд аргументов -e работал для меня на окнах, используя MKS! Спасибо!

используя awk, без чтения всего файла в память:

awk '{printf "%s ", $0}' inputfile

Если вы хотите последний перевод строки:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

Вы можете использовать символ, отличный от пробела:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile
 New Alexandria06 янв. 2013 г., 18:53
Это сработало для меня, гдеsed решения не

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta
Простое для понимания решение

что мне нужно решение для работы на BSD 's (MacОперационные системыX) и GNU 's (Linux иCygwin)sed а также :tr

$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

Выход:

foo
bar
baz

(завершающий перевод строки)

Работает на Linux, OS X и BSD - даже безUTF-8, поддержка или с дерьмовым терминалом.

использованиеtr поменять строку с другим символом. (

NULL\000 или же\x00) хорошо, потому что это нене нужна поддержка UTF-8, и этовряд ли будет использоваться.

использованиеsed чтобы соответствоватьNULL

использованиеtr поменять местами дополнительные символы новой строки, если они вам нужны

 sqweek29 февр. 2016 г., 09:59
Тонкая заметка о номенклатуре: характер\000 обычно упоминается какNUL (один л) иNULL обычно используется, когда речь идет о нулевойуказатель (в C / C ++).
Замените символы новой строки любой строкой, а также замените последний символ новой строки.

Чистыйtr решения можно заменить только одним символом, а чистыйsed решения незаменить последнюю новую строку ввода. Следующее решение устраняет эти проблемы и, по-видимому, безопасно для двоичных данных (даже при использовании языка UTF-8):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

Результат:

1<br>2<br>3<br>
 Håkon A. Hjortland27 июн. 2013 г., 02:48
@StevenLu: нет,@ на входе все ок. Это сбежит в%a и обратно Однако решение может быть не полностью POSIX-совместимым (NULL-байты не разрешены, поэтому не годятся для двоичных данных, и все строки должны заканчиваться символом новой строки, поэтомуtr вывод не действительно действителен).
 Steven Lu22 июн. 2013 г., 19:38
Это плохо, потому что это приведет к нежелательному выводу на любой вход, содержащий@
 Steven Lu27 июн. 2013 г., 04:48
Ах. Я тебя вижу'Я исправил это. В некотором роде извилистые для того, что должно быть простая операция, но хорошая работа.

СЕПГ который вводит новые строки после "нормальный" замена. Сначала он обрезает символ новой строки, затем обрабатывает в соответствии с вашими инструкциями, затем вводит новую строку.

С помощьюСЕПГ вы можете заменитьконец" строки (не символа новой строки) после обрезки с выбранной строкой для каждой входной строки; но,СЕПГ будет выводить разные строки. Например, предположим, что вы хотите заменить "конец линии" с "===» (более общий, чем замена одним пробелом):

PROMPT~$ cat <<eof |sed="" 's="" $="" =="=/g'" first="" line="" second="" 3rd="" eof="" prompt~$="" <="" code=""></eof>

Чтобы заменить символ новой строки на строку, вы можете, хотя и неэффективно, использовать<strong>тр</strong> как указывалось ранее, заменить символы новой строки на "специальный символ " а затем использовать<strong>СЕПГ</strong> заменить т специальный символ на строку, которую вы хотите.

Например:

<code>PROMPT~$ cat <<eof |="" tr="" '\n'="" \x01'|sed="" -e="" 's="" \x01="" =="=/g'" first="" line="" second="" 3rd="" eof="" <="" code=""></eof></code>
Решение Вопроса

Используйте это решение с GNU:sed

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

Это прочитает весь файл в цикле, а затем заменит символы новой строки пробелом.

Объяснение:

Создать ярлык через.:aДобавьте текущую и следующую строку в пространство шаблона с помощью.NЕсли мы до последней строки, перейдите к созданному ярлыку ($!ba$! означает не делать это в последней строке, так как должен быть один последний перевод строки).Наконец, подстановка заменяет каждую новую строку пробелом в пространстве образца (который является целым файлом).

Вот кроссплатформенный совместимый синтаксис, который работает с BSD и OS Xsed (согласно@Benjie комментарий):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

Как видите, используяsed для этого в противном случае простая проблема проблематична. Для более простого и адекватного решения см.этот ответ

 Zsolt Botykai02 апр. 2013 г., 16:34
@ Edmorton, не могли бы вы рассказать о том, чтот работает?
 Håkon A. Hjortland26 февр. 2013 г., 14:38
Последняя новая строка ввода не будет заменена. Например.printf '1\n2\n3\n' | sed ':a;N;$!ba;s/\n/ /g' дам .1 2 3\n
 Léo Léopold Hertz 준영10 авг. 2009 г., 00:30
Арджан: Это не работает с Mac. Это не меняет файл, вообще.
 Leo Gallucci09 дек. 2013 г., 23:47
Не работает с цветным выводом. Я попробовал все на этом Q &А и ничего не получалось, когда вывод цветной. Проверено на Ubuntu 13.04
 Andrew Snejovski13 июл. 2018 г., 14:31
Создает файл со ссылками, \ n 'с еще здесь.
 potong12 дек. 2011 г., 20:17
Это тоже работаетsed ':a;N;$!ba;y/\n/ /'
 trusktr15 июл. 2013 г., 07:29
Почему ": a; N; $! ba; s / \ n / / g " работать и не простоs / \ n / / g "?
 Ark-kun26 окт. 2012 г., 04:51
Почему нетЛюбой, кто комментирует, что это за глупость (не сам ответ, а программа, для которой предложенный ответ является лучшим решением очень простой проблемы). Сед похож на автомобиль, который обычно работает нормально, но если вы хотите проехать на определенную близлежащую улицу, единственный способ - поднять автомобиль с помощью вертолета.
 jaypal singh09 янв. 2012 г., 17:50
И это тожеsed ':a;{N;s/\n/ /};ba' :П
 Dev Null22 авг. 2016 г., 16:34
Спасибо за объяснение - учит нас, как ловить рыбу, а не просто дает нам рыбу!
 Léo Léopold Hertz 준영09 авг. 2009 г., 23:03
+1 за объяснения и решение исходного вопроса.
 grilix06 мар. 2017 г., 14:54
Работал как для GNU, так и для BSD, спасибо !!
 Telemachus09 авг. 2009 г., 23:32
@Arjan и Masi: OS X использует BSDsed а не GNUsedТаким образом, могут быть некоторые тонкие (и некоторые не очень тонкие) различия между ними. Это постоянная боль, если вы работаете на компьютерах с OS X и * nix. Я обычно устанавливаю GNUcoreutils а такжеfindutils на OS X и игнорируйте версии BSD.
 Isaac13 янв. 2019 г., 19:20
Это терпит неудачу с однострочным вводом для некоторых seds: tryprintf 'abc\n' | sed ':a;N;$!ba;s/\n/ /g', Решение для этого (и как общее решение также) должно использовать:printf 'abc\n' | sed ':a;$!{N;ba};s/\n/ /g'
 tiktak31 авг. 2013 г., 13:38
Это также отличная заменаxargs -0особенно когда получаешьСлишком длинная аргументация ошибка.
 Ed Morton02 апр. 2013 г., 17:00
@ZsoltBotykai смотрите комментарий, предшествующий моему, а также использование \ n будет работать только в некоторых seds на некоторых ОС - переносимый способ указать новую строку в sed - это обратный слеш, за которым следует буквальный символ новой строки. Просто прочитайте комментарии выше - примерно треть из них говорят, что это не так.не работают для них, и еще треть людей говорят, что они неЯ не понимаю этого. Вы просто не должны использовать sed для подобных вещей.
 atti02 февр. 2017 г., 20:33
если$! является "не делать это на последней строчке, тогда почемуsed ':a;N;ba;s/\n/ /g' (без$!) не работает?
 Jonathan Neufeld16 июл. 2014 г., 00:03
Это отличный ресурс для сжатия персонажей новой строки при работе с sed. Можно использовать этот фрагмент для перевода ряда строк, если вы неЯ не хочу переводить весь файл.
 ghoti13 сент. 2018 г., 06:20
Что касается решения BSD sed, единственным требованием здесь является разделение команд после меток. Такsed -e ':a' -e 'N;$!ba' -e 's/\n/ /g' было бы достаточно.
 atevm23 сент. 2018 г., 13:54
Идеальное описание, как построить и использовать космическую станцию, чтобы ударить гвоздь в голову с орбиты, но, возможно, следует использовать молоток, который будетtr команда.
 gaoithe10 сент. 2015 г., 13:35
Я хотел заменить некоторые, но не все символы новой строки в файле. например все строки, заканчивающиеся PULLUP. Это сработало:sed ':a;N;$!ba;s/PULLUP\n/ /g;', В этом случае полезно использовать sed.
 Arjan09 авг. 2009 г., 23:14
@ Маси, ты получаешь другой вывод на Mac? Mac OS X наверняка знаетsed команда; Я'Я был бы немного разочарован, если результат отличается.
 Dennis Williamson17 окт. 2009 г., 19:52
:a ISN»это регистр, этоs метка ветки. Это'цель дляb команда * которая работает как "идти к", Называя его регистром, вы можете создавать места для хранения. Есть только два "регистры»; один называется "держать пространство " что ваш сценарий нет, а другой называется "шаблон пространства ",N Команда добавляет новую строку и и следующую строку входного файла в пространство шаблона. [* Вы можете иметь несколько ярлыков и b команды. Если у тебя естьb команда без добавленной к ней метки char переходит к концу сценария, чтобы прочитать следующую строку и повторить цикл.]
 Zsolt Botykai02 апр. 2013 г., 20:17
@ Edmorton ты абсолютно прав, яне использовать его сам (tr гораздо проще для этого). Тем не менее, вопрос был в том, как это сделать сsedкоторый я прочитал, понял и ответил, в старые добрые времена. И для меня это работало (и я как-то понял это, хотя я прочитал некоторую документацию для изучения этого замечательного инструмента).
 Léo Léopold Hertz 준영09 авг. 2009 г., 23:06
Хотя tr-tool, вероятно, лучший путь, я должен принять ваш вопрос, потому что он решает вопрос.
 Gambhiro19 сент. 2011 г., 19:39
Это должно идти в sed1line.txt, это было бы полезно для случаев, когда вы хотите прочитать весь файл в пространство шаблона. ZseniáЛис!
 1ac006 окт. 2014 г., 10:14
хороший пример просто для других - если у вас есть файл sql со вставкой в ... команды сinsert into на одной линии иvalues во-вторых, чем объединить их в одну строку сsed ':a;N;$!ba;s/\nvalues/ values/g'
 Zsolt Botykai20 июл. 2013 г., 22:24
@trusktr увидеть этот ответ:stackoverflow.com/a/7697604/11621 есть объяснение, скопированное из официального седа FAQ.
 Benjie27 сент. 2011 г., 13:16
Вы можете запустить эту кроссплатформенную платформу (то есть в Mac OS X), выполняя команды отдельно, а не разделяя их точкой с запятой:sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
 josifoski20 сент. 2014 г., 12:38
какой будет перевод для диапазона строк? @ jonathan-neufeld Отсутствует ответ sed здесь:stackoverflow.com/questions/25947391/...
 Ed Morton02 апр. 2013 г., 04:04
Давай, ребята - 261 голос за сумасшедшее, непонятное решение, которое нет работа ???? sed - отличный инструмент для простых замен в одной строке, для всего остального просто используйте awk. Печаль во благо....
 chriv19 сент. 2012 г., 01:15
Я неЯ тоже этого не понимаю, но у меня есть эта страница в моих синхронизированных закладках, так что я могу получить к ней доступ, когда мне это нужно. Вы могли бы подумать, что я не забуду использовать dmckee 'с решением (tr '\ П» ' ') который должен быть намного проще (как для использования, так и для запоминания).
 typelogic05 мар. 2017 г., 07:53
@atti the $! Заставляет все заклинания накапливать все строки в буфере шаблонов, а затем выполняет массовую замену из этого буфера и однократную печать.

У GNU SED есть опция-z для разделенных нулями записей (строк). Вы можете просто позвонить:

sed -z 's/\n/ /g'
 Ruslan04 мар. 2016 г., 10:43
Победил'т это загрузить весь вход, если естьнет нулей? В этом случае обработка файла объемом в несколько гигабайт может привести к сбою.
 not2qubit21 февр. 2018 г., 22:10
Это серьезноЛучший ответ. Другие выражения слишком искажены, чтобы их запомнить. @JJoao Вы можете использовать его с-u, --unbuffered,man маг заявляет:загружать минимальные объемы данных из входных файлов и чаще очищать выходные буферы ».
 JJoao04 мар. 2016 г., 10:50
@Ruslan, да, он загружает весь ввод. Это решение не очень хорошая идея для мультигигабайтных файлов.
 sjas07 мар. 2019 г., 16:07
так. много. этот.
 Toby Speight16 февр. 2016 г., 18:42
Даже если входные данные содержат нули, они будут сохранены (как разделители записей).

Вы также можете использовать этот метод

sed 'x;G;1!h;s/\n/ /g;$!d'

объяснение

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting next line until the
      last line.

Поток:

Когда первая строка получена из ввода, производится обмен, поэтому 1 переходит в пространство для хранения и попадает в пространство шаблона, затем добавляет пространство для хранения в пространство шаблона, а затем выполняется подстановка и удаляется пространство шаблона.

Во время второй линии происходит обмен, 2 идет на пробел и 1 приходит на пробел, затемG добавить пространство удержания в пространство образца, затемh скопируйте образец к нему, и замена сделана и удалена. Эта операция продолжается до тех пор, пока eof не будет достигнут, затем выведите точный результат.

 Spooky13 мар. 2015 г., 02:41
Однако следует помнить, чтоecho 'Y' | sed 'x;G;1!h;s/\n/X/g;$!d' результаты в.XY

использованиеtr вместо?

tr '\n' ' ' < input_filename

или полностью удалите символы новой строки:

tr -d '\n' < input.txt > output.txt

или если у вас есть версия GNU (с ее длинными опциями)

tr --delete '\n' < input.txt > output.txt
 Aaron Franke09 дек. 2018 г., 19:39
Есть ли способ только удалить?\n\n
 trusktr15 июл. 2013 г., 07:26
Так гораздо проще, чем sed для поиска и замены.
 dmckee09 дек. 2018 г., 21:15
@AaronFranke Не сtr, Работает на отдельных персонажах.
 Sopalajo de Arrierez25 июн. 2016 г., 23:55
Как примечание стороны,--delete не работает на FreeBSD. Используя только-d даст больше переносимости к ответу.
 jseals14 сент. 2017 г., 19:35
Отлично. Попытка сделать это на действительно большом файле в TextMate, и он взорвал куски. Было сделано в считанные секунды с тр.
 dmckee24 июл. 2012 г., 05:33
@ J.B.Browntr это часто пропускаемая жемчужина для строительства трубопроводов.
 Leo Gallucci09 дек. 2013 г., 23:48
Не работает с цветным выводом. Я попробовал все на этом Q &А и ничего не получалось, когда вывод цветной. Проверено на Ubuntu 13.04
 J.B. Brown24 июл. 2012 г., 05:32
Этот ответ был очень полезен для меня, чтобы объединить три последовательные строки файла (журнала) в одну, в процессе: grep --after-context 3 (pattern) (file) | тр\ П» ' ' | sed -e 's / - / \ n / g '.
 rjohnston31 янв. 2013 г., 00:07
@ Eddy - я использовал tr, чтобы заменить новые строки символом, который непоявляется в тексте (я использовал backtick), затем sed заменяет backtick на строку, которую я хотел использовать
 Léo Léopold Hertz 준영09 авг. 2009 г., 21:18
Я не могу понять, почему sed не может этого сделать. Пожалуйста, уточните, чтобы использовать другой инструмент.
 yota28 мая 2013 г., 14:09
Ну яЯ рад, что получил ответ Жолта Ботыкай. Stackoverflow также используется для выработки новых решений. Чтобы удалить пробелы между тегами xml:cat input.svg | sed -e ':a;N;$!ba;s/>\W*
 ssc24 авг. 2016 г., 12:28
@SopalajodeArrierez: то же самое в OS X
 ELLIOTTCABLE26 дек. 2014 г., 00:50
Это лучшее решение; особенно сочетаниеsed а также :trtr '\n' '␤' | sed 's/␤/ .. /g'
 dmckee24 авг. 2016 г., 15:12
@SopalajodeArrierez Хороший вопрос. Благодарю.
 cp.engr19 янв. 2016 г., 20:04
@jheriko, ОП попросилизамещать переводы строк. Описывает ли это вашу ситуацию ("делает регулярное выражение " - что бы вы ни имели в виду под "делать»)?
 Eddy01 авг. 2012 г., 11:06
tr отлично, но вы можете заменить только новые строки одиночными символами. Вам нужно использовать другой инструмент, если вы хотите заменить символы новой строки на строку
 Thomas Ahle26 мар. 2015 г., 17:36
Или удалить символы новой строки:tr -d '\n' < input_filename
 arr_sea18 апр. 2014 г., 00:31
@elgalu - Это вероятно потому, что цвета, которые являются символами, мешают вашему шаблону поиска / замены. Я использую следующий псевдоним, чтобы удалить цвета из потока, когда это необходимо:alias noc='sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"'
 dmckee09 авг. 2009 г., 21:39
Сед работает на "поток" ввода, но он понимает его в разделителях строки, разделенных символом новой строки. Это инструмент Unix, что означает, что он делает одну вещь очень хорошо. Одна вещь "работа над файлом построчно, Заставить его сделать что-то еще будет сложно, и это может привести к ошибкам. Мораль этой истории такова: выберите правильный инструмент. Очень многие ваши вопросы, кажется, принимают формуКак я могу заставить этот инструмент делать то, чего он никогда не делал? " Эти вопросы интересны, но если они возникнут в процессе решения реальной проблемы, вы 'вероятно, делаю это неправильно.
 hese04 нояб. 2011 г., 20:02
Синтаксис с 'тр» для этой проблемы, кажется, очень просто и более понятно, чем sed.
 jheriko19 авг. 2015 г., 17:12
это хорошо ... но не очень общий совет. если я делаю регулярное выражение, где я хочу новую строку там, то tr ничего не стоит для меня ....
 Léo Léopold Hertz 준영09 авг. 2009 г., 21:26
Александр: делаетпотоковый редактор " средняя линия на основе? Возможно, название сбивает с толку.
 Alexander Gladysh09 авг. 2009 г., 21:22
Sed основан на строках, поэтому ему трудно понять новые строки.
 jheriko21 янв. 2016 г., 17:41
я имею в виду использование sed для замены некоторого регулярного выражения, где оно должно соответствовать строке, содержащей символ новой строки. это достаточно далеко от вопроса ОП, чтобы быть четким.

sed вы'Сначала нужно добавить следующую строку в пространство шаблона, используя ""N, Из раздела "Multiline Pattern Space " в "Advanced sed Commands " книгиsed & AWK (Дейл Догерти и Арнольд Роббинс; O 'Рейли 1997; страница 107 впредварительный просмотр):

Многострочная команда Next (N) создает многострочное пространство шаблонов, читая новую строку ввода и добавляя ее к содержимому пространства шаблонов. Исходное содержимое пространства шаблона и новая строка ввода разделены новой строкой. Встроенный символ новой строки может быть сопоставлен в шаблонах с помощью escape-последовательности "", В многострочном шаблонном метасимволе "^" соответствует самому первому символу пространства образца, а не символу (ам) после любой встроенной новой строки (ей). Аналогично, «$» соответствует только последней новой строке в шаблонном пространстве, а не любым встроенным символам новой строки. После выполнения команды Next управление передается последующим командам в сценарии.

От :man sed

[2addr] Н

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

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

ДругаяGNU sed метод, почти такой же, какЖолт Ботыкайответ, но это используетsedменее часто используется (yтранслитерировать) команда, которая сохраняетодин байт кода (конечныйg):

sed ':a;N;$!ba;y/\n/ /'

Можно было бы надеятьсяy будет работать быстрее, чемs(возможно вtr скорости, в 20 раз быстрее), но вGNU sed v4.2.2 y около4% медленнее чем .s

Более портативныйBSD sed версия:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'
 ghoti13 сент. 2018 г., 06:26
Кроме того, команды BSD sed должны завершаться после метки, поэтомуsed -e ':a' -e 'N;$!ba' -e 'y/\n/ /' был бы способ пойти.
 Thor03 нояб. 2016 г., 20:01
С BSD седy примерно на 15% быстрее. Увидетьэтот ответ для рабочего примера.

Perl Версия работает так, как вы ожидали.

Как указано в комментариях, этоСтоит отметить, что это редактирует на месте.-i.bak перед заменой предоставит вам резервную копию исходного файларегулярное выражение ISN»т, как умный, как вы думали.

 Steven Lu10 апр. 2019 г., 04:57
Это'очень жаль, что это неработать со стандартным вводом, указав- для имени файла. Есть способ сделать это? Тот'Мой способ не беспокоиться об изменении файла - использовать конвейер, который начинается с cat.
 Telemachus09 авг. 2009 г., 23:36
@Ire_and_curses: На самом деле, вы только что сделали чертовски хороший аргумент за игнорирование меня. То есть у вас есть причины для вашего выбора, и я согласен с тем, согласен я или нет с этим выбором. Я'Я не совсем уверен, почему, но яв последнее время мы были в слезах по поводу этой конкретной вещи (-i флаг в Perl без суффикса). Я'я уверен, что яДостаточно скоро найду что-нибудь еще, чем можно заняться. :)
 Telemachus09 авг. 2009 г., 22:31
Пожалуйста, по крайней мере, упомянуть, что-i без суффикса делаетнет резервной копии.-i.bak защищает вас от простой, некрасивой ошибки (скажем, забыв набрать-p и обнуление файла).
 ire_and_curses10 апр. 2019 г., 17:47
@StevenLu Perl будет читать из STDIN по умолчанию, если не указано имя файла. Таким образом, вы могли бы сделать, например,perl -i -p -e 's/\n//' < infile > outfile
 alle_meije22 нояб. 2017 г., 11:24
каким-то образом perl работал в linux, а sed - нет ?!
 ire_and_curses09 авг. 2009 г., 22:53
@Telemachus: этоЭто справедливо, но это можно утверждать в любом случае. Основная причина, по которой я неНе говоря уже о том, что Sed пример в OP 'вопрос нене делать резервных копий, поэтому здесь это кажется излишним. Другая причина в том, что яя никогда не использовал функцию резервного копирования (автоматическое резервное копирование меня раздражает), поэтому я всегда забываютам. Третья причина - это делает мою командную строку на четыре символа длиннее. К лучшему или худшему (возможно, хуже), яm компульсивный минималист; Я просто предпочитаю краткость. Я понимаю, что ты нене согласен Я буду стараться изо всех сил помнить, чтобы предупредить о резервных копиях в будущем.

которое мне особенно нравится, состоит в том, чтобы добавить весь файл в область хранения и заменить все новые строки в конце файла:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

Однако кто-то сказал мне, что пространство удержания может быть конечным в некоторых реализациях sed.

 Jeff09 июл. 2016 г., 08:34
замена пустой строкой в вашем ответе скрывает тот факт, что всегда добавление H к пробелу означает, что пробел будет начинаться с новой строки. Чтобы этого избежать, нужно использовать1h;2,$H;${x;s/\n/x/g;p}
Пуленепробиваемое решение. Бинарные данные безопасны и POSIX-совместимы, но медленно.

POSIX сед требует ввода в соответствии сPOSIX текстовый файл а такжеЛиния POSIX определения, поэтому NULL-байты и слишком длинные строки не допускаются, и каждая строка должна заканчиваться символом новой строки (включая последнюю строку). Это затрудняет использование sed для обработки произвольных входных данных.

Следующее решение исключает sed и вместо этого преобразует входные байты в восьмеричные коды, а затем снова в байты, но перехватывает восьмеричный код 012 (новая строка) и выводит строку замены вместо нее. Насколько я могу судить, решение является POSIX-совместимым, поэтому оно должно работать на самых разных платформах.

od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
  while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done

Справочная документация POSIX:ш,командный язык оболочки,О.Д.,т,Grep,читать, [,Printf.

И то и другое ,read[, а такжеprintf встроены, по крайней мере, в bash, но это, вероятно, не гарантируется POSIX, поэтому на некоторых платформах может быть так, что каждый входной байт будет запускать один или несколько новых процессов, что будет замедлять работу. Даже в bash это решение достигает только 50 кБ / с, так чтоне подходит для больших файлов.

Протестировано на Ubuntu (bash, dash и busybox), FreeBSD и OpenBSD.

Более короткая альтернатива awk:

awk 1 ORS=' '
объяснение

Программа на awk состоит из правил, которые состоят из условных кодовых блоков, то есть:

condition { code-block }

Если кодовый блок опущен, используется значение по умолчанию:{ print $0 }, Таким образом1 интерпретируется как истинное условие иprint $0 выполняется для каждой строки.

когдаawk читает входные данные, которые разбивает его на записи на основе значенияRS (Record Separator), который по умолчанию является новой строкой, таким образомawk будет по умолчанию анализировать ввод по строке. Разделение также включает в себя удалениеRS из входной записи.

Теперь, при печати записи,ORS (Выходной разделитель записей) добавляется к нему, по умолчанию снова переводится строка. Так что, изменивORS в пробел все новые строки заменяются пробелами.

 Udi 28 мар. 2018 г., 17:52
Вы можете сделать это более простым:code awk 'ПРС =» «» file.txtcode
 Fedir RYKHTIK30 июл. 2013 г., 15:29
Мне очень нравится это простое решение, которое гораздо более читабельно, чем другие
 Ed Morton02 апр. 2013 г., 04:09
ясно, просто, элегантно и функционально! +1.
 Panagiotis Moustafellos15 мая 2015 г., 11:51
Мне нравится такой подход, надо отдать больше голосов ИМХО.
 Bernie Reiter28 мар. 2019 г., 12:54
При использовании awk, подобного этому, к сожалению, также удаляется последний перевод строки в файле. Смотрите ответ Патрика Дарк выше об использованиитр» в подоболочке вроде `cat file | echo $ (tr "\ 012" " "), которая делает свое дело. Острота.
 michael19 сент. 2014 г., 03:22
Если это имеет больше смысла, это может быть эффективно записано как:awk 'BEGIN { ORS=" " } { print $0 } END { print "\n"} ' file.txt (добавление завершающего символа новой строки только для иллюстрации начала / конца); «1» оцениваетtrue (обработать строку) иprint (напечатать строку). Условное обозначение также может быть добавлено к этому выражению, например, работает только со строками, соответствующими шаблону:awk 'BEGIN { ORS=" " } /pattern/ { print $0 } END { print "\n"} '

tr (или жеcatи т. д.) абсолютно не нужно. (ГНУ)sed и (GNU)awkв сочетании может выполнять 99,9% любой обработки текста, которая вам нужна.

поток! = строка на основе.ed это линейный редактор.sed не является. Увидетьлекция для получения дополнительной информации о разнице. Большинство людей путаютsed быть основанным на строках, потому что по умолчанию он не очень жадный в сопоставлении с образцом для совпадений SIMPLE - например, при поиске и замене образца по одному или двум символам он по умолчанию заменяет только первое найденное совпадение ( если не указано иное глобальной командой). Не было бы даже глобальной команды, если бы она основывалась на строках, а не на STREAM, потому что она будет оценивать только строки за раз. Попробуйте запуститьed; вы'заметит разницу.ed Это очень полезно, если вы хотите перебрать определенные строки (например, в цикле for), но в большинстве случаев выЯ просто хочу.sed

Что, как говорится,

sed -e '{:q;N;s/\n/ /g;t q}' file

прекрасно работает в GNUsed версия 4.2.1. Приведенная выше команда заменит все новые строки пробелами. Это'уродливо и немного громоздко печатать, но работает просто отлично. '{}S могут быть опущены, так как онивключены только по соображениям здравомыслия.

 hek2mgl30 мар. 2016 г., 00:33
Статья, которую выссылка не отражает то, что вы говорите
 brandizzi03 авг. 2011 г., 02:48
Что такоеone? Я не знаю эту команду!
 Thor03 нояб. 2016 г., 21:17
Это почти в 800 раз медленнее, чем принятый ответ на большом входе. Это связано с выполнением замены для каждой строки на все большем вводе.
 textshell26 июн. 2015 г., 13:17
С помощьюt q как условный переход это работает с шаблоном, какs/\n / / (объединить все строки, начинающиеся с пробела), не считывая весь файл в память. Удобно при преобразовании мультимегабайтных файлов.
 Nate04 мар. 2014 г., 20:15
Как человек, который знает только достаточноsed чтобы делать базовые вещи, я должен это сказатьбольше чем о чем тыМожно делать сsed а точнее, как легко понять, что происходит. Мне очень тяжело работать сsed поэтому я бы предпочел более простую команду, когда смогу ее использовать.

Быстрый ответ:

: а создать ярлык 'a'N добавить следующую строку в пространство шаблона$! если не последняя строка,ба ответвление (перейти к) обозначить 'a's замена,/ \ П / регулярное выражение для новой строки,/ / на пробел, глобальное совпадение (столько раз, сколько возможно)

sed будет перебирать шаги с 1 по 3, пока не достигнет последней строки, поместив все строки в шаблонное пространство, где sed заменит все символы

Альтернативы:

Все альтернативы, в отличие отСЕПГ не нужно будет достигать последней строки, чтобы начать процесс

судар, медленный

while read line; do printf "%s" "$line "; done < file

сPerl,СЕПГскорость

perl -p -e 's/\n/ /' file

стр, быстрее, чемСЕПГ, может заменить только один символ

tr '\n' ' ' < file

свставить,тр-подобная скорость, может заменить только один символ

paste -s -d ' ' file

сAWK,трскорость

awk 1 ORS=' ' file

Другая альтернатива вродеecho $ (< файл)" работает медленно, работает только с небольшими файлами и должен обработать весь файл, чтобы начать процесс.

Длинный ответ отSed FAQ 5.10:

5.10. Почему можноя соответствую или удаляю новую строку, используя escape

последовательность? Почему можноя сопоставляю 2 или более строк, используя?

Никогда не будет соответствовать символу новой строки в конце строки, потому что

символ новой строки всегда удаляется, прежде чем строка помещается в

образец пространства. Чтобы получить 2 или более строк в пространстве шаблона, используйте

затем' команда или что-то подобное (например, 'H, ..., г;»).

Sed работает так: sed читает по одной строке за раз, отрубает

завершающий перевод строки, помещает то, что осталось в пространство шаблона, где

Сценарий Sed может адресовать или изменять его, и когда образец пространства

печатается, добавляет новую строку в стандартный вывод (или в файл). Если

пространство образца полностью или частично удаляется с помощью 'd' или 'D',

перевод строкине добавлено в таких случаях. Таким образом, сценарии, такие как

  sed 's/\n//' file       # to delete newlines from each line             
  sed 's/\n/foo\n/' file  # to add a word to the end of each line         

НИКОГДА не будет работать, потому что завершающий перевод новой строки удалендо

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

используйте вместо этого один из этих сценариев:

  tr -d '\n' < file              # use tr to delete newlines              
  sed ':a;N;$!ba;s/\n//g' file   # GNU sed to delete newlines             
  sed 's/$/ foo/' file           # add "foo" to end of each line          

Поскольку версии sed, отличные от GNU sed, имеют ограничения на размер

буфер шаблонов, Unix 'тр» полезность должна быть предпочтительной здесь.

Если последняя строка файла содержит символ новой строки, GNU sed добавит

этот перевод строки в вывод, но удалить все остальные, тогда как tr будет

удалить все новые строки.

Чтобы сопоставить блок из двух или более строк, есть 3 основных варианта:

(1) используйте «N» команда для добавления следующей строки в пространство шаблона;

(2) используйте «H» Команда, по крайней мере, дважды, чтобы добавить текущую строку

в пространство удержания, а затем получить линии из пространства удержания

с х, г или G; или (3) использовать диапазоны адресов (см. раздел 3.3 выше)

чтобы сопоставить строки между двумя указанными адресами.

Варианты (1) и (2) будут помещены в пространство шаблона, где оно

можно обратиться по желанию ('s / ABCXYZ / алфавит / г»). Один пример

использования 'N' удалить блок строк появляется в разделе 4.13 ("

Как мне удалить блокконкретный последовательные строки?). это

пример можно изменить, изменив команду delete на что-то

еще как "р" (печать), «я» (вставить), 'c' (изменить), «а» (Добавить),

или 's' (замена).

Выбор (3) не будет помещать в пространство шаблона, но этоделает

сопоставить блок последовательных строк, поэтому может случиться так, что вы не

даже нужно, чтобы найти то, что выищу. С ГНУ СЭД

версия 3.02.80 теперь поддерживает этот синтаксис:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

в дополнение к традиционному/отсюда туда/{...}' спектр

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

 New Alexandria06 янв. 2013 г., 18:57
tr была отличная идея, и ваш общий охват дает качественный ответ.
 Leo Gallucci09 дек. 2013 г., 23:51
Не работает с цветным выводом. Я попробовал все на этом Q &А и ничего не получалось, когда вывод цветной. Проверено на Ubuntu 13.04
 Totor15 мар. 2013 г., 12:10
+1 за использование (стандартная утилита)paste... и все остальные!
 xlttj07 янв. 2012 г., 15:36
Спасибо за команду вставки. Я не'не знаю этого. У меня есть файл с некоторыми URL-адресами, и я хотел открыть их все сразу в браузере Chrome. Итак, я сделал (на Mac OS X):paste -s -d ' ' url.txt | xargs open  Работает отлично.
 hdorio11 дек. 2013 г., 10:36
@elgalu попробуй этоunix.stackexchange.com/questions/4527/...
 Pianosaurus28 июн. 2012 г., 19:03
Хороший ответ. В альтернативе bash есть небольшая проблема. Это потерпит неудачу на линиях, которые интерпретируются как переключение на эхо. Вот почему я никогда не использую echo для печати переменных данных. использованиеprintf '%s' "$line " вместо.
 pdwalker02 мая 2014 г., 13:20
Лучшая часть этого ответа заключается в том, чтодлинный ответ объясняет, как и почему работает команда
 Pysis15 нояб. 2017 г., 15:17
Мне нужно было заменить несколькими персонажами, и я действительно наслаждался глубиной и организацией этого ответа. Моя примерная команда была такой:awk 1 ORS='\\\n', Прочитайте что1 значит от ТораОтвет: истинное состояние программы awk, просто вызывающее печать каждой строки ввода.
 hdorio10 февр. 2012 г., 00:28
@ XL-T вы должны использоватьxargs -a url.txt open вместо
 mightypile30 июн. 2015 г., 01:37
Это может быть самым полезным из тысяч ответов, которые ячитаем на stackexchange. Мне нужно сопоставить несколько символов в разных строках. Ни один из предыдущих примеров sed не покрывал многострочные и tr can 't обрабатывать сопоставление нескольких символов. Perl выглядит хорошо, но нене работает, как я ожидаю. Я'буду голосовать за этот ответ несколько раз, если смогу.

потому что я пытался с большинствомsed приведенный выше пример похвалы, который не работает для меня в моем окне Unix и выдает мне сообщение об ошибкеLabel too long: {:q;N;s/\n/ /g;t q}, Наконец, я сделал свое требование и, следовательно, поделился здесь, который работает во всех средах Unix / Linux: -

line=$(while read line; do echo -n "$line "; done < yoursourcefile.txt)
echo $line |sed 's/ //g' > sortedoutput.txt

Первая строка удалит всю новую строку из файлаyoursourcefile.txt и будет производить одну линию. И второйsed Команда удалит все пробелы из него.

 pyb22 мар. 2018 г., 23:15
Очень простой, удобный для чтения и переносимый.

xargs - это заменит\n с пробелом по умолчанию.

Тем не менее, это будет иметь проблемы, если ваш вклад имеет какой-либо случайunterminated quoteнапример, если цитата подписывается на данной строке, нет совпадают.

 AAAfarmclub22 авг. 2015 г., 23:37
xargs также хорошо обрабатывает последнюю строку:

Ты можешь использоватьxargs:

seq 10 | xargs

или же

seq 10 | xargs echo -n
 Udi 28 мар. 2018 г., 18:31
Работа для меня: я 'xargs < file.txt
 Toby Speight16 февр. 2016 г., 18:43
Это не влияет наfile бы то ни было ...

Ваш ответ на вопрос