- Удаление знаков переноса строки в bash
- 3 ответа 3
- Как удалить newline (символ новой строки) из вывода команд и файлов в командной строке Linux
- Как удалить newline (перевод строки) из строки в Bash
- Как удалить символ newline из строки
- echo
- tr
- sed
- Perl
- awk
- Удаление newline из результатов выполнения команды
- printf
- xargs и echo
- Подстановка команды
- Как удалить только последний символ newline из многострочного вывода
- Perl
- printf
- Как удалить newline из файла в Bash
- Как удалить newline из переменной в Bash
- Как заменить newline («\n») на пробел (» «)
- tr
- sed
- Bash
- Perl
- paste
- awk
- xargs
- Как заменить переносы строки симолами «\n»?
- sv99 / How can I replace a newline (\n) using sed.md
Удаление знаков переноса строки в 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 -
Ещё один пример использования:
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 для записей (строк), разделённых нулём. Вы можете просто вызвать:
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 чтобы оно выводилось как текст, а не было управляющей командой.
Ой, спасибо, дорогой! Век не забуду! Вот это работает! 😀
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.