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

Теперь я решил эту проблему таким образом,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the 
default TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
    }
};
// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    System.out.println(e);
}
1244
задан Eliran Malka 7 February 2017 в 15:54
поделиться

23 ответа

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

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

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

Объяснение:

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

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

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

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

1404
ответ дан jpp 7 February 2017 в 15:54
поделиться

Если вам не повезло иметь дело с окончаниями окон Windows, вам нужно удалить \r и \n

tr '[\r\n]' ' ' < $input > $output
3
ответ дан StevenWernerCS 7 February 2017 в 15:54
поделиться

Использование Awk:

awk "BEGIN { o=\"\" }  { o=o \" \" \[110] }  END { print o; }"
3
ответ дан kralyk 7 February 2017 в 15:54
поделиться

Вы также можете использовать Стандартный текстовый редактор :

printf '%s\n%s\n%s\n' '%s/$/ /' '%j' 'w' | ed -s file

Примечание: это сохраняет результат обратно в file.

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

0
ответ дан Thor 7 February 2017 в 15:54
поделиться

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

awk 1 ORS=' '

Объяснение

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

condition { code-block }

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

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

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

209
ответ дан Thor 7 February 2017 в 15:54
поделиться

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

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

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

84
ответ дан Peter Mortensen 7 February 2017 в 15:54
поделиться

Попробуйте это:

echo "a,b"|sed 's/,/\r\n/'
-6
ответ дан animuson 7 February 2017 в 15:54
поделиться

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

tr '\n' ' ' < input

у меня не сработало, было бы либо ошибка, либо на самом деле заменить \ nw / '' по некоторым причинам.

Используя другую функцию tr, опция -d «delete» сработала, хотя:

tr -d '\n' < input

или '\ r \ n' вместо '\ n'

6
ответ дан John Lawler 7 February 2017 в 15:54
поделиться

В Mac OS X (с использованием FreeBSD 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
3
ответ дан bashfu 7 February 2017 в 15:54
поделиться

Вы можете использовать xargs & mdash; по умолчанию он заменит \n пробелом.

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

4
ответ дан cnst 7 February 2017 в 15:54
поделиться

Следующее намного проще, чем большинство ответов. Также работает:

echo `sed -e 's/$/\ |\ /g' file`
-2
ответ дан Peter Mortensen 7 February 2017 в 15:54
поделиться

Я думаю, что самый простой и быстрый способ сделать это - использовать grep, есть ярлык для использования grep с regexp egrep aka grep -E, поэтому мы просто сделаем

egrep '^\S.+' fileNameWithUnneededNewLines > ClearedFile
-1
ответ дан nikoss 7 February 2017 в 15:54
поделиться
sed '1h;1!H;$!d
     x;s/\n/ /g' YourFile

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

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

 sed ':loop
 $! N
 s/\n/ /
 t loop' YourFile
1
ответ дан Thor 7 February 2017 в 15:54
поделиться

Я не эксперт, но, думаю, в sed сначала нужно добавить следующую строку в пространство шаблонов, используя bij, используя «N». Из раздела «Пространство многострочных шаблонов» в «Advanced sed Commands» книги sed & amp; awk (Дейл Догерти и Арнольд Роббинс; O'Reilly 1997; страница 107 в превью ):

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

Из man sed:

[2addr] N

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

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

9
ответ дан Community 7 February 2017 в 15:54
поделиться

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

sed ':a;N;$!ba;s/\n/ /g' file
  1. : a создать метку 'a'
  2. N добавить следующую строку в пространство шаблонов
  3. $! , если не последняя строка , ba ответвление (перейти к) метка 'a'
  4. s заменять , / \ n / регулярное выражение для новой строки , / / через пробел , / g глобальное совпадение (столько раз, сколько возможно)

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


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

Все альтернативы, в отличие от sed , не должны достигать последней строки, чтобы начать процесс

с bash , медленный

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

с perl , sed -подобная скорость

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

с tr , быстрее, чем sed , может заменить только один символ

tr '\n' ' ' < file

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

paste -s -d ' ' file

с awk , tr -подобной скоростью

awk 1 ORS=' ' file

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


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

5.10. Почему я не могу сопоставить или удалить символ новой строки, используя последовательность \ n escape
? Почему я не могу сопоставить 2 или более строк, используя \ n?

\ n никогда не будет соответствовать новой строке в конце строки, потому что новая строка
всегда удаляется перед тем, как строка помещается в пространство паттернов
. Чтобы получить 2 или более строк в пространство шаблонов, используйте
команду 'N' или что-то подобное (например, 'H; ...; g;').

Sed работает следующим образом это: sed читает по одной строке за раз, отсекает завершающую новую строку
, помещает то, что осталось в пространство шаблона, где
скрипт sed может адресовать или изменять его, и когда шаблон пробел
печатается, добавляет новую строку в stdout (или в файл) .Если пространство шаблона
полностью или частично удалено с '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 'tr' здесь предпочтительнее.
Если последняя строка файла содержит новую строку, GNU sed добавит
эту новую строку в вывод, но удалит все остальные, тогда как tr
удалит все новые строки.

Чтобы сопоставить блок из двух или более строк, есть 3 основных варианта:
(1) используйте команду 'N', чтобы добавить следующую строку в пространство шаблона;
(2) использовать команду «H» как минимум дважды, чтобы добавить текущую строку
к пространству удержания, а затем извлечь строки из пространства удержания
с помощью x, g или G; или (3) использовать диапазоны адресов (см. раздел 3.3 выше)
для сопоставления линий между двумя указанными адресами.

Варианты (1) и (2) помещают \ n в пространство шаблона, где к нему
можно обращаться по своему усмотрению ('s / ABC \ nXYZ / alphabet / g') , Один пример
использования 'N' для удаления блока строк приведен в разделе 4.13
(«Как удалить блок из определенных последовательных строк?») , Этот пример
можно изменить, изменив команду удаления на что-то
, например, «p» (печать), «i» (вставка), «c» (изменение), «a '(добавить),
или' s '(заменить).

Выбор (3) не будет помещать \ n в пространство шаблона, но он соответствует
блоку последовательных строк, поэтому может случиться так, что вы не наденете '
даже не нужно \ n найти то, что вы ищете. Поскольку GNU sed
версии 3.02.80 теперь поддерживает этот синтаксис:

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

в дополнение к традиционному диапазону '/ from here /, / to there / {...}'
адресов, может быть возможно полностью избежать использования \ n.

451
ответ дан hdorio 7 February 2017 в 15:54
поделиться

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

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

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

3
ответ дан brandizzi 7 February 2017 в 15:54
поделиться

Другой метод 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/ /'
2
ответ дан agc 7 February 2017 в 15:54
поделиться

Я использовал гибридный подход для обхода новой строки, используя tr для замены новой строки на вкладки, а затем заменяя вкладки тем, что я хочу. В этом случае «
», так как я пытаюсь сгенерировать разрывы HTML.

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
6
ответ дан Peter Mortensen 7 February 2017 в 15:54
поделиться

Ответ с меткой ...

Как заменить символ новой строки (\ 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 похож.

12
ответ дан Community 7 February 2017 в 15:54
поделиться

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

seq 10 | xargs

или

seq 10 | xargs echo -n
10
ответ дан Peter Mortensen 7 February 2017 в 15:54
поделиться

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

dos2unix yourfile yourfile
2
ответ дан 19 December 2019 в 20:16
поделиться

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


Лучше использовать команду tr следующим образом:

tr '\n' ' ' < input_filename

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

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

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

tr --delete '\n' < input.txt > output.txt
1647
ответ дан 19 December 2019 в 20:16
поделиться

Кому нужен sed ? Вот способ bash :

cat test.txt |  while read line; do echo -n "$line "; done
44
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: