Теперь я решил эту проблему таким образом,
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);
}
Используйте это решение с GNU sed
:
sed ':a;N;$!ba;s/\n/ /g' file
Это прочитает весь файл в цикле, а затем заменит символы новой строки пробелом.
Объяснение:
:a
. N
. $!ba
($!
означает не делать этого в последней строке, так как должен быть один последний перевод строки). Вот кроссплатформенный совместимый синтаксис, который работает с BSD и OS X sed
(согласно @Benjie comment ):
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file
Как вы можете видеть Использование sed
для этой, в остальном, простой задачи проблематично. Для более простого и адекватного решения см. этот ответ .
Если вам не повезло иметь дело с окончаниями окон Windows, вам нужно удалить \r
и \n
tr '[\r\n]' ' ' < $input > $output
Использование Awk:
awk "BEGIN { o=\"\" } { o=o \" \" \[110] } END { print o; }"
Вы также можете использовать Стандартный текстовый редактор :
printf '%s\n%s\n%s\n' '%s/$/ /' '%j' 'w' | ed -s file
Примечание: это сохраняет результат обратно в file
.
Как и в sed
, это решение страдает от необходимости сначала загружать весь файл в память.
Более короткая альтернатива awk:
awk 1 ORS=' '
Программа awk состоит из правил, которые состоят из условных кодовых блоков, то есть:
condition { code-block }
Если кодовый блок опущен, используется значение по умолчанию: { print [112] }
. Таким образом, 1
интерпретируется как истинное условие, а print [114]
выполняется для каждой строки.
Когда awk
считывает ввод, он разбивает его на записи, основываясь на значении RS
(Разделитель записей), который по умолчанию является новой строкой, поэтому awk
будет по умолчанию анализировать ввод построчно. Разделение также включает удаление RS
из входной записи.
Теперь, при печати записи, к ней добавляется ORS
(Разделитель выходной записи), по умолчанию снова вводится новая строка. Таким образом, изменяя ORS
на пробел, все новые строки заменяются пробелами.
Версия Perl работает так, как вы ожидали.
perl -i -p -e 's/\n//' file
Как указано в комментариях, стоит отметить, что это редактирует на месте. -i.bak
даст вам резервную копию исходного файла перед заменой на случай, если ваше регулярное выражение окажется не таким умным, как вы думали.
В ответ на вышеприведенное решение «tr» в Windows (возможно, с использованием версии tr для Gnuwin32) предложенное решение:
tr '\n' ' ' < input
у меня не сработало, было бы либо ошибка, либо на самом деле заменить \ nw / '' по некоторым причинам.
Используя другую функцию tr, опция -d «delete» сработала, хотя:
tr -d '\n' < input
или '\ r \ n' вместо '\ n'
В 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
Вы можете использовать xargs
& mdash; по умолчанию он заменит \n
пробелом.
Однако, это будет иметь проблемы, если ваш вход имеет какой-либо случай unterminated quote
, например если кавычки на данной строке не совпадают.
Следующее намного проще, чем большинство ответов. Также работает:
echo `sed -e 's/$/\ |\ /g' file`
Я думаю, что самый простой и быстрый способ сделать это - использовать grep, есть ярлык для использования grep с regexp egrep
aka grep -E
, поэтому мы просто сделаем
egrep '^\S.+' fileNameWithUnneededNewLines > ClearedFile
sed '1h;1!H;$!d
x;s/\n/ /g' YourFile
Это не работает для огромных файлов (ограничение буфера), но очень эффективно, если имеется достаточно памяти для хранения файла. (Исправление H
-> 1h;1!H
после хорошего замечания @hilojack)
Еще одна версия, которая изменяет новую строку при чтении (больше процессора, меньше памяти)
sed ':loop
$! N
s/\n/ /
t loop' YourFile
Я не эксперт, но, думаю, в sed
сначала нужно добавить следующую строку в пространство шаблонов, используя bij, используя «N
». Из раздела «Пространство многострочных шаблонов» в «Advanced sed Commands» книги sed & amp; awk (Дейл Догерти и Арнольд Роббинс; O'Reilly 1997; страница 107 в превью ):
Многострочная команда Next (N) создает пространство многострочного паттерна прочитав новую строку ввода и добавив ее к содержимому пространства шаблона. Исходное содержимое пространства шаблона и новая строка ввода разделены новой строкой. Встроенный символ новой строки можно сопоставить в шаблонах с помощью escape-последовательности "\ n". В многострочном шаблонном пространстве метасимвол «^» соответствует самому первому символу шаблонного пространства, а не символу (ам) после любой встроенной новой строки (ей). Точно так же, «$» соответствует только последней новой строке в пространстве шаблона, а не любой внедренной новой строке. После выполнения команды Next управление передается последующим командам в сценарии.
Из man sed
:
[2addr] N
Присоединить следующую строку ввода к пространству шаблона, используя встроенный символ новой строки, чтобы отделить добавленный материал из оригинального содержания. Обратите внимание, что текущий номер строки изменяется.
Я использовал это для поиска (нескольких) плохо отформатированных файлов журналов, в которых строка поиска может быть найдена в «потерянной» следующей строке.
Быстрый ответ:
sed ':a;N;$!ba;s/\n/ /g' file
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.
Решение, которое мне особенно нравится, состоит в том, чтобы добавить весь файл в область удержания и заменить все новые строки в конце файла:
$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar
Однако кто-то сказал мне, что пространство удержания может быть конечным в некоторых реализации sed.
Другой метод 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/ /'
Я использовал гибридный подход для обхода новой строки, используя tr для замены новой строки на вкладки, а затем заменяя вкладки тем, что я хочу. В этом случае «
», так как я пытаюсь сгенерировать разрывы HTML.
echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
Ответ с меткой ...
Как заменить символ новой строки (\ 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 похож.
@OP, если вы хотите заменить символы новой строки в файле, вы можете просто использовать dos2unix (или unix2dox)
dos2unix yourfile yourfile
sed
предназначен для использования при линейном вводе. Хотя он может делать то, что вам нужно.
Лучше использовать команду tr
следующим образом:
tr '\n' ' ' < input_filename
или полностью удалить символы новой строки:
tr -d '\n' < input.txt > output.txt
или, если у вас есть версия GNU (с его длинными параметрами)
tr --delete '\n' < input.txt > output.txt
Кому нужен sed
? Вот способ bash
:
cat test.txt | while read line; do echo -n "$line "; done