Использование sed для преобразования строк в строки

Скажем, у меня есть переменная $string shell, которая содержит некоторый текст с несколькими символами новой строки, например:

 string="this is a test" 

Я хотел бы преобразовать эту строку в новую строку new_string где все разрывы строк преобразуются в пробелы:

 new_string="this is a test" 

Я пытался:

 print $string | sed 's/\n/ /g' 

но это не сработало

Мне также интересно, есть ли способ сделать это, используя perl -0777 's/\n/ /g' или, может быть, команду tr ?

8 Solutions collect form web for “Использование sed для преобразования строк в строки”

Если вы хотите удалить только новые строки в строке, вам не нужно использовать sed . Вы можете использовать только

 $ echo "$string" | tr '\n' ' ' 

как указывали другие.

Но если вы хотите преобразовать новые строки в пробелы в файле с помощью sed , вы можете использовать:

 $ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks 

или даже awk :

 $ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces 

Вместо этого вы можете попробовать использовать tr :

 echo "$string" | tr '\n' ' ' 

Еще один вариант – использовать xargs (который, кроме того, сжимает несколько пробелов):

 string="this is a test" printf "$string" | xargs # this is a test 

Echo игнорирует пробел, поэтому он должен работать:

 new_string=`echo $string` 

Если у вас уже есть строка как переменная bash, как показывает ваш пример, бессмысленно и расточительно использовать ресурсы (и больше набирать текст) для вызова sed , awk , printf и т. Д. Вы можете просто использовать расширение переменной bash :

 string="${string//$'\n'/ }" 

Вам даже не нужно переписывать его. Вы можете использовать расширение as-is и оставить $string неизменной.

 printf "${string//$'\n'/ }" >file 

Вы также можете попробовать эту команду awk,

 awk -v RS="" '{gsub (/\n/," ")}1' file 

Пример:

 $ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1' This is a test. 
 state=$(set +o) set -f ; IFS=' '; set -- $string unset IFS; string="$*" eval "$state" 

Это преобразует любую последовательность из одного или нескольких символов \n ewline, входящих в переменную оболочки $string в одно <space> .

Вы можете использовать простую команду sed

  $-sed ':loop;N;s/\n/ /g;t loop' 
  • SED на Mac OS X
  • Удалить все узлы <FOLDER>! = Значение тега
  • Извлечь вторую строку в строке вывода
  • Сравнивая File1 и File2, чтобы прокомментировать соответствующий шаблон в File2
  • Комментируйте разделы текста, соответствующие определенным идентификаторам, перечисленным в другом файле
  • Поиск шаблона между определенными линиями и номерами строк печати
  • Использование tee для добавления строки в файл, а также использовать ее в качестве замены шаблона в другом файле
  • Используйте AWK для разделения подстроки на последние n символов на новый столбец
  • Вырезание текста между двумя запятыми, исключая последующий текст
  • Строки - Извлечь версию файла Рекурсивный
  • Наложение символа между повторяющимися символами
  • Interesting Posts

    «Ошибка файловой системы только для чтения» на Samba share, альтернативный вариант с одинаковыми параметрами (клиент Linux)

    Как удалить код возврата из подсказки терминала в Sugar на Stick?

    Wake on LAN не работает на Ubuntu 16.04

    Обновлять тюрьмы FreeBSD в бесшумном режиме

    Разрешения «проблема» с использованием SCP для копирования в корневую папку из локального

    Получать значения по блоку в одном файле

    Как рандомизировать вывод из seq?

    Движение мыши перемещается, когда средняя кнопка удерживается

    Служба Squid systemd не запускается при загрузке

    Проблема с монтированием дисков NTFS

    FreeBSD: добавление псевдонима ip к интерфейсу прерывает сеть на первичном ip

    Получите оболочку для входа в систему как root `su -l` без изменения каталога

    Что не так с Lubuntu 17.04 64-битной версией?

    Хранение пароля секретного ключа для автоматической установки SSHFS?

    Маршруты удаляются при подключении к нескольким VPN-соединениям

    Linux и Unix - лучшая ОС в мире.