Заменить перенос строки linux

Удаление знаков переноса строки в bash

Регулярка извлекает с файла кусок многострочного текста. Следующая задача — получить из него одну строку. Попробовал sed «s/\r\n//» . Комбинации опробованы различные. Гуглю различные вариации обозначения знака переноса, не получается. За направление правильного гуления скажу большое спасибо ). текст — utf-8.

stroka3 stroka2 stroka1 stroka1 stroka2 stroka3 — результат \n разнообразно опробован и без результата. различные флаги sed и tr

Что-то вы делаете не так 🙂 $ cat in.txt stroka3 stroka2 stroka1 stroka1 stroka2 stroka3 $ cat in.txt | tr -s ‘\r\n’ ‘ ‘ stroka3 stroka2 stroka1 stroka1 stroka2 stroka3 $ cat in.txt | tr -d ‘\r\n’ stroka3stroka2stroka1stroka1stroka2stroka3

3 ответа 3

cat in.txt | tr -s '\r\n' ' ' > out.txt 

Или, если склеить строки (в примере выше \r\n меняется на пробел):

cat in.txt | tr -d '\r\n' > out.txt 

P.S. ‘\r\n’ меняем на ‘\n’ для unix-переводов строк.

смотрим содержимое файла in.txt ~ $ cat in.txt stroka3

stroka2 stroka1 stroka1 stroka2 stroka3 

загоняем всё что в файле в переменную

с помощью echo выводим содержимое переменной

~ $ echo "$string" # переменная в кавычках выдаст с переносами строк stroka3 stroka2 stroka1 stroka1 stroka2 stroka3 ~ $ echo $string # переменная БЕЗ кавычкех выдаст БЕЗ переносов строк stroka3 stroka2 stroka1 stroka1 stroka2 stroka3 

Источник

Как удалить newline (символ новой строки) из вывода команд и файлов в командной строке Linux

Как удалить newline (перевод строки) из строки в Bash

Для перевода строки в операционных системах используются символы:

Причём в Linux используется \n (также называется EOL, End of Line, newline, новая строка). В других операционных системах могут быть вариации.

По умолчанию многие программы, утилиты командной строки Linux автоматически добавляют символ newline — в целом это делает вывод более читаемым. Но иногда символ перевода строки не нужен. Эта заметка посвящена тому, как убрать из строки вывода или из строк файла символ новой строки (newline).

Как удалить символ newline из строки

echo

Если вы выводите строку или результат выполнения команды с помощью «echo», то вы можете использовать опцию -n, которая означает не выводить конечный символ newline.

Обратите внимание на различный результат команд:

echo -n 'HackWare.ru' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a - echo 'HackWare.ru' | md5sum 19acfcdef400742c5de064e0bf9e9a87 -

Первая команда считает контрольную сумму строки «HackWare.ru», а вторая команда считает контрольную сумму строки «HackWare.ru» к которой добавлен конечный символ newline.

tr

Вы можете удалить конечный символ новой строки с помощью tr в конструкции

echo 'HackWare.ru' | tr -d '\n' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -

sed

Вы можете удалить конечный символ новой строки с помощью sed в конструкции (данная команда удаляет символы «\n» и «\r»:

echo 'HackWare.ru' | sed -z 's/[\n\r]//g' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -

Perl

Следующая конструкция на PERL также удаляет символ новой строки:

echo 'HackWare.ru' | perl -pe 'chomp' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -

Ещё один пример использования:

Читайте также:  Удаление linux windows загрузчик

awk

С помощью awk вы можете удалить символы newline (новой строки) используя следующую конструкцию:

echo 'HackWare.ru' | awk '< printf "%s", $0 >' | md5sum

Смотрите также: Уроки по Awk

echo 'HackWare.ru' | awk '' | md5sum

Удаление newline из результатов выполнения команды

Все предыдущие примеры можно использовать для удаления newline из вывода команд, передав вывод по конвейеру (трубе, «|»). Далее приведены ещё несколько конструкций, которые вы можете использовать для удаления newline из результатов выполнения команды.

printf

Поместите КОМАНДУ в конструкцию вида:

Будет выведен результат выполнения КОМАНДЫ без конечного символа newline.

printf '%s' $(echo 'HackWare.ru') | md5sum

xargs и echo

Для подавления вывода символа новой строки newline вы можете использовать конструкцию с xargs:

Будьте внимательны с предыдущей конструкцией, поскольку она также ещё и сжимает пробелы. Чтобы понять о чём идёт речь, изучите вывод следующей команды:

echo «a b» | xargs echo -n; echo -n $(echo «a b»)

Поскольку xargs может быть очень медленной, вы можете использовать следующую конструкцию:

Помните, что если вывод начинается с -e, то предыдущая конструкция будет истолковывать вывод как опцию echo.

Подстановка команды

В следующих примерах команда, заключённая в «$(КОМАНДА)» будет выведена без конечного newline:

Как удалить только последний символ newline из многострочного вывода

Все предыдущие примеры подразумевают, что удаление символа выполняется из однострочного вывода. Если вам нужно удалить последний символ из многострочного вывода, то далее показано, как это сделать.

Perl

Следующая команда выведет содержимое файла log.txt, при этом будет удалён только один символ newline в самом конце файла, все остальные newline будут сохранены. Особенностью команды является то, что даже если файл заканчивается на несколько символов newline, все они будут удалены.

perl -pe 'chomp if eof' log.txt

printf

Следующий пример также удалит символ newline в конце файла log.txt, но удалён будет строго ПОСЛЕДНИЙ символ newline:

Как удалить newline из файла в Bash

Вы можете использовать вывод содержимого файла в паре с любой из перечисленных выше конструкций для удаления newline. Например:

Аналог предыдущей команды:

Команды awk, sed, perl и другие могут как обрабатывать стандартный ввод, так и получать имена файла, который нужно обработать (удалить символы newline) в виде опции. Примеры:

awk '< printf "%s", $0 >' log.txt awk '' file sed ':a;N;$!ba;s/\n//g' file.txt perl -p -i -e 's/\R//g;' filename

Как удалить newline из переменной в Bash

Для удаления символа newline (или любых других символов) вы можете использовать Pattern substitution (разновидность Shell Parameter Expansion), формат следующий:

При этом символ newline (\n) нужно экранировать обратным слэшом.

Вывод переменной без удаления newline:

text=’hello\n\nthere\nagain\n’ echo -e $

Вывод переменной с удалением всех newline:

text='hello\n\nthere\nagain\n' echo -e $

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

text='hello\n\nthere\nagain\n' echo -e $

Вывод переменной с удалением последнего newline:

text='hello\n\nthere\nagain\n' echo -e $

Как заменить newline («\n») на пробел (» «)

tr

Чтобы заменить newline («\n«) на пробел вы можете использовать следующую конструкцию:

echo -e 'hello\n\nthere\nagain\n' | tr '\n' ' '

sed

Кросс-платформенный совместимый синтаксис, который работает с BSD и OS X sed:

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

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

Читайте также:  Linux awk несколько строк

Bash

while read line; do printf "%s" "$line "; done < FILE
cat FILE.txt | while read line; do echo -n "$line "; done

Ещё один вариант написания:

while read line; do echo -n "$line "; done < FILE.txt

Perl

Решение на perl, скорость примерно как с sed:

paste

Решение с paste, скорость примерно как с tr, может заменять только один символ:

awk

Решение с awk, скорость примерно как с tr:

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

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

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

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

Смотрите также: Уроки по Awk

Ещё один вариант, чтобы заменить все новые строки пробелами с помощью awk, не считывая весь файл в память:

Если вы хотите, чтобы присутствовал финальный newline:

Вы можете использовать не только символ пробела (в данном случае вместо пробела разделителем является символ «|»):

Ещё одно просто решение на awk:

xargs

Простое решение на xargs:

Источник

Как заменить переносы строки симолами «\n»?

Привет! Подскажите как с помощью bash или shell, можно вместо невидимых переносов поставить видимые символы \n ? Т.е. дан текстовый файл вида :

С помощью каких команд его можно привести к виду

А из командной строки как можно сделать? С указанием конкретного файла?

тебе лучше man sed или man awk погуглить.

Да, я бы с радостью, но у меня времени катастрофически времени нет, нужно готовое решение костыль :( . Мне вот тут на тостере подсказали

/home/oracle/aaa>cat text.txt bla blah bleah /home/oracle/aaa>sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/,/g' text.txt > ou /home/oracle/aaa>cat ou bla,blah,bleah

Только здесь вместо \n запятая, а надо \n прописью. Если просто вводить \n то ничего не меняется и строки просто переносятся. Надо как-то экранировать его. Чтобы оно выводилось как текст.

Решение не очень тривиальное, так как перевод строки не является частью pattern space в sed (источник):

$ echo -e 'a\nb\nc' | sed ':a;N;$!ba;s!\n!\\n!g' a\nb\nc 

xaizek ★★★★★ ( 03.11.16 13:28:21 MSK )
Последнее исправление: xaizek 03.11.16 13:28:43 MSK (всего исправлений: 1)

Зачем вам sed на таком уровне, что вы его не понимаете, делайте в две команды — одной дописать косую черту, а другой заменить перенос строки на 'n':

sed 's/$/\\/' text.txt | tr '\n' 'n' > ou 

Как заменить переносы строки симолами «\n»? (комментарий) Вот это работает. Осталось только разобраться как экранировать \n чтобы оно выводилось как текст, а не было управляющей командой.

Читайте также:  Calculate linux установка wine

Ой, спасибо, дорогой! Век не забуду! Вот это работает! 😀

Источник

sv99 / How can I replace a newline (\n) using sed.md

Long answer from the sed FAQ 5.10:

5.10. Why can't I match or delete a newline using the \n escape sequence? Why can't I match 2 or more lines using \n?

The \n will never match the newline at the end-of-line because the newline is always stripped off before the line is placed into the pattern space. To get 2 or more lines into the pattern space, use the 'N' command or something similar (such as 'H;. ;g;').

Sed works like this: sed reads one line at a time, chops off the terminating newline, puts what is left into the pattern space where the sed script can address or change it, and when the pattern space is printed, appends a newline to stdout (or to a file). If the pattern space is entirely or partially deleted with 'd' or 'D', the newline is not added in such cases. Thus, scripts like

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 

will NEVER work, because the trailing newline is removed before the line is put into the pattern space. To perform the above tasks, use one of these scripts instead:

Since versions of sed other than GNU sed have limits to the size of the pattern buffer, the Unix 'tr' utility is to be preferred here. If the last line of the file contains a newline, GNU sed will add that newline to the output but delete all others, whereas tr will delete all newlines.

To match a block of two or more lines, there are 3 basic choices: (1) use the 'N' command to add the Next line to the pattern space; (2) use the 'H' command at least twice to append the current line to the Hold space, and then retrieve the lines from the hold space with x, g, or G; or (3) use address ranges (see section 3.3, above) to match lines between two specified addresses.

Choices (1) and (2) will put an \n into the pattern space, where it can be addressed as desired ('s/ABC\nXYZ/alphabet/g'). One example of using 'N' to delete a block of lines appears in section 4.13 ("How do I delete a block of specific consecutive lines?"). This example can be modified by changing the delete command to something else, like 'p' (print), 'i' (insert), 'c' (change), 'a' (append), or 's' (substitute).

Choice (3) will not put an \n into the pattern space, but it does match a block of consecutive lines, so it may be that you don't even need the \n to find what you're looking for. Since GNU sed version 3.02.80 now supports this syntax:

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

in addition to the traditional '/from here/,/to there/<. >' range addresses, it may be possible to avoid the use of \n entirely.

Источник

Оцените статью
Adblock
detector