Linux убрать переносы строк

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

при выгрузке случился баг и после data3 добавился знак переноса строки \n и все сьехало на две строки. data3 обрамлен » (двойные ковычки) файл очень большой 1 мил строк и в ручную не вариант переделывать подскажите как через sed убрать перенос строки для того чтобы сьехавший хвост вытянулся в одну строку сейчас файл имеет такой вид

data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 
data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4 

4 ответа 4

[VladD@Kenga] [00:59:25] [~] $> cat xx.txt data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 [VladD@Kenga] [00:59:32] [~] $> sed 'N;s/\n"/"/' xx.txt data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4 

Для более сложных случаев (возможны «обыкновенные» строки) попробуйте так:

[VladD@Kenga] [01:35:47] [~] $> cat xx.txt header "data1",data2,"data3 ",data4 intermediate data data1,"data2 ","data3 ",data4 data1,data2,"data3 ",data4 [VladD@Kenga] [01:35:52] [~] $> sed '/^",/; x' xx.txt header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4 [VladD@Kenga] [01:35:57] [~] $> sed '/^",/; x' xx.txt | sed '1d' header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4 

Внимение: последняя строка должна заканчиваться переводом строки, иначе она будет «проглочена»!

Объяснение: нам необходимо, когда мы видим строку, начинающуюся с кавычки, знать предыдущую строку, чтобы склеить их. Для этого мы «задерживаем» вывод строк, отправляя их в hold space вместо вывода, и выводя вместо этого предыдущую строку, лежащую там же ( x ).

Для случая, когда строка начинается с кавычки ( /^»/ ) начинаем действовать. В hold space лежит предыдущая строка, пристыковываем к ней текущую ( H ), и обмениваем hold space с pattern space ( x ), чтобы можно было обработать текст. Удаляем \n ( s/\n// ), и отправляем назад строку в hold space, чтобы проанализировать и вывести её на следующем цикле. Обрубок строки, который получился в pattern space, удаляем, и завершаем эту итерацию ( d ).

Источник

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

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

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

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

Читайте также:  Linux посмотреть сколько места осталось

По умолчанию многие программы, утилиты командной строки 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:

Читайте также:  Скорость usb порта linux

Как удалить 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 на пробел, все символы новой строки заменяются пробелами.

Читайте также:  Writing device drivers in linux

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

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

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

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

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

xargs

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

Источник

Как убрать перенос строк с помощью sed?

illifant и mm3 большое спасибо. Ваши ответы очень помогли.

если нужно удалить все \n, то проще использовать

А зачем там «/$/N» вместо просто «N»?

Тема обсосана на stackoverflow.

Мёсье не осилил увидеть команды : и t на видном месте в мане, и теперь со всех требует прув, не допуская существования более вдумчивых людей?

без понятия что означают все эти 20 символов (объяснил бы хоть кто), но они работают.

Здесь куча способов удалить '\n' на разных языках.

Эти? 1) метка 2) добавляем к текущей строке сдедующую (через \n) 3) удаляем разделитель 3) если команда s/// что-то сделала - переходим на метку.

Видно, что /$/ - лишний, но /../ может пригодиться, например: /\\$/.

Похожие темы

  • Форум всемогущий sed (2017)
  • Форум sed vs awk (2008)
  • Форум Удалить последнее слово в строке awk, sed (2014)
  • Форум sed диапазон строк (2013)
  • Форум Как с помощью sed вставить в конец каждой строки файла апостроф? (2022)
  • Форум Оптимизировать sed разбивку файла (2020)
  • Форум Разделитель ascii для sed и awk (2015)
  • Форум awk и sed (2011)
  • Форум Sed (вырезать подстроки из строки) (2012)
  • Форум Книги по AWK, SED (2013)

Источник

Удаление знаков переноса строки в 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 

Источник

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