Как заменить символ новой строки (\ n) с помощью sed? - PullRequest
1233 голосов
/ 09 августа 2009

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

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

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

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

Ответы [ 41 ]

3 голосов
/ 26 февраля 2013

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

Чистые 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>
3 голосов
/ 16 апреля 2014

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

Используя sed , вы можете заменить «конец» строки (не символ новой строки) после обрезки выбранной строкой для каждой строки ввода; но sed выведет разные строки. Например, предположим, что вы хотели заменить «конец строки» на «===» (более общий, чем замена на один пробел):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

Чтобы заменить символ новой строки на строку, вы можете, хотя и неэффективно, использовать tr , как указано выше, чтобы заменить символы новой строки на "специальный символ", а затем использовать sed , чтобы заменить этот специальный символ на нужную вам строку.

Например:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$
3 голосов
/ 06 июня 2011

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

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"
3 голосов
/ 13 июля 2011

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

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

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

3 голосов
/ 28 июля 2010

В 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
2 голосов
/ 10 августа 2009

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

dos2unix yourfile yourfile
2 голосов
/ 10 апреля 2019

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

tr '[\r\n]' ' ' < $input > $output
2 голосов
/ 18 июля 2014

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

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 переходит в пространство пробелов, а \ n переходит в пространство шаблонов, затем добавляется пространство удержаний в пространство шаблонов, а затем выполняется подстановка и удаляется пространство шаблонов.
Во время обмена второй строкой 2 переходит в пространство удержания, а 1 - в пространство образца, затем G добавляет пространство удержания в пространство образца, затем h копирует образец в него, и подстановка выполняется и удаляется. Эта операция продолжается до тех пор, пока eof не будет достигнут, затем выведите точный результат.

2 голосов
/ 03 июля 2016

Другой GNU sed метод, почти такой же, как Zsolt Botykai , ответ , но он использует 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/ /'
1 голос
/ 17 июля 2018

Находит и заменяет с помощью разрешения \ n

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

Маркер

Становится

# Маркерный комментарий

Маркер

...