(Как) я могу удалить все новые строки (\ n), используя sed? - PullRequest
5 голосов
/ 13 июля 2011

Я попытался удалить все новые строки в трубе, как это:

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

В результате чего debian сжал:

00000000  66 6f 6f 20 62 61 72 0a                           |foo bar.|
00000008

Не удаляет завершающий символ новой строки.

tr -d '\n' как в Как удалить переводы строк из текстового файла? работает просто отлично, но не sed.

Ответы [ 6 ]

8 голосов
/ 13 июля 2011

Извините, что нельзя сделать с помощью sed, см. http://sed.sourceforge.net/sedfaq5.html#s5.10 и обсуждение здесь: http://objectmix.com/awk/26812-sed-remove-last-new-line-2.html

Похоже, что sed добавит обратно \ n, если он присутствует какпоследний символ.

1 голос
/ 13 июля 2011

Если вы хотите удалить последние \n, вам нужна внешняя утилита или используйте, например, awk.

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

должно работать.

0 голосов
/ 22 октября 2013

Вы также можете попробовать:

(echo foo; echo bar) | sed 's/\n//' | xargs echo -n
0 голосов
/ 07 августа 2013

Если foo и bar не должны содержать новые строки, вы должны знать, что

(echo foo; echo bar)

будет добавлять новую строку после каждого echo

(echo -n foo; echo -n bar)

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

0 голосов
/ 17 июля 2013

Сравнить: (эхо фу; эхо бар) | sed -e: a -e N -e '$! ba' -e 's / \ n / / g' | hexdump -C с (echo foo; echo bar) | tr -d '\ n' | hexdump -C а затем с эхо фу; эхо-бар) | hexdump -C | sed -e: -e N -e '$! ba' -e 's / \ n / / g'

0 голосов
/ 13 июля 2011
{ echo foo; echo bar; } | awk '{printf("%s ", $0)}' 
...