Как я могу заменить пробелы на новые строки на входе, как:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
и т.д...
Чтобы получить следующее:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Запись
Я отправляю этот вопрос, чтобы помочь другим пользователям, было нелегко найти полезный ответ в UNIX SE, пока я не начал набирать этот вопрос. После этого я обнаружил следующее:
Связанный вопрос
bash
text-processing
string
laconbass
источник
источник
Ответы:
Используйте
tr
командуНайдено на http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
источник
tr
для, хотя!В этом случае я бы использовал printf:
Если в одном из путей есть пробелы , вы можете заключить в кавычки этот путь к файлу, чтобы предотвратить его разбиение на пробелы:
Для преобразования текста в целом,
tr
ваша лучшая ставка, как описано в существующем ответе.источник
Предполагая, что у вас есть строка с пробелами в качестве разделителей:
Однако вы, вероятно, задаете не тот вопрос. (Не обязательно, например, это может появиться в make-файле.) Разделенный пробелами список имен файлов на самом деле не работает: что если одно из имен файлов содержит пробелы?
Если программа получает имена файлов в качестве аргументов, не объединяйте их с пробелами. Используйте
"$@"
для доступа к ним один за другим. Хотяecho "$@"
печатает аргументы с пробелами между ними, это происходит из-заecho
: он печатает свои аргументы с пробелами в качестве разделителей.somecommand "$@"
передает имена файлов как отдельные аргументы в команду. Если вы хотите напечатать аргументы в отдельных строках, вы можете использоватьЕсли у вас есть имена файлов, разделенных пробелами, и вы хотите поместить их в массив для работы с ними, вы можете использовать расширение переменной без кавычек, чтобы разделить значение на символы
IFS
(вам нужно отключить расширение с помощью символа подстановкиset -f
, в противном случае glob шаблоны будут расширены по значению):Вы можете заключить это в функцию, которая восстанавливает
-f
настройку и значение,IFS
когда это будет сделано:источник
set -f
иIFS
в руководстве по bash, если хотите узнать все подробности. См. Также unix.stackexchange.com/questions/16192/…IFS
локально не вступает в силуБудьте прагматичны, используйте sed !!
Выше сказано заменить один или несколько пробельных символов (\ s +) символом новой строки (\ n)
Это более или менее:
источник
В качестве альтернативы
tr
@laconbass вы также можете использоватьxargs
в этом случае:Преимущество заключается в том, что он работает даже с несколькими пробелами, чего
tr
нет.источник
Вот как я это сделал:
Обратите внимание на использование клавиши Enter после обратной косой черты в
sed
команде.источник
sed
закончилисьtr
?sed
помощью редактора, а не просто переводить символы.sed
может сделать гораздо больше, но это совершенно излишне.tr
это правильный инструмент для этой работы, но знаниеsed
и регулярные выражения наверняка пригодятся позже!Другой подход, предполагая, что строка находится в переменной с именем
line
:Это использует тот факт, что Bash разделяет свои аргументы по пробелам по умолчанию, и это
echo
добавляет новую строку к его вводу по умолчанию.источник
это еще один метод для преобразования слов, разделенных пробелом, в символ новой строки.
источник
Следующий скрипт прост в понимании и использовании.
источник
tr
) такая же, как и в принятом ответе. Кроме того, у вашего ответа есть следующие проблемы: a) команда не имеет отступа в 4 пробела (-> разметка уценки) b) использованиеcat
вами бесполезно (вы можете заменить его на< filename tr ' ' '\n'
). c) Ваше имя файла вывода совпадает с именем файла ввода. С этим вы создаете гонку данных.