удар - заменяет пространство новой строкой

Выделенное дисковое пространство является пределом на дисковое пространство, которое может занять пользователь. Это не имеет никакого отношения к свободному пространству на диске. Посмотрите на страницу руководства для квоты (1). Таким образом, при попытке синхронизировать (выписывают данные, сохраненные в памяти, предназначенной в файлы на диске) это находит, что Нельзя записать так много данных.

И BTW, нет никакого "пространства в папках" в Unix/Linux. Каталог является просто ассоциацией между именами и inodes, и inode представляет файл/каталог (с его владельцем/группой, полномочиями и содержавшими данными). inode может очень хорошо быть перечислен больше чем в одном каталоге, или даже несколько раз под различными именами в том же каталоге.

77
13.04.2017, 15:37
9 ответов

Используйте tr команда

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"

Найденный на http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html

135
27.01.2020, 19:30
  • 1
    tr был моей первой мыслью также, хотя существует столько способов сделать это! Это в значительной степени ТОЧНО что tr для, хотя! –  Rob 17.12.2013, 17:43
  • 2
    +1, но как комментарий: Это не работает, если имена файлов содержат сами пробелы –  Bonsi Scott 17.12.2013, 18:10

В этом случае я использовал бы printf:

printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5

Если существуют пробелы в том из путей, можно заключить этому в кавычки filepath, чтобы препятствовать тому, чтобы он был разделен на пробелах:

printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file

Преобразовать текст в целом, tr Ваш лучший выбор, как покрыто в существующий ответ.

20
27.01.2020, 19:30
  • 1
    быстрое примечание от будущего: благодарит отправить это решение, это было очень надежно для меня, по сравнению с использованием "эха". –  Liesmith 01.05.2015, 00:48

Принятие Вас имеет строку с пробелами как разделители:

newline_separated=${space_separated// /$'\n'}

Однако Вы, вероятно, задаете неправильный вопрос. (Не обязательно, например, это могло бы подойти в make-файле.) Разделенный пробелом список имен файлов действительно не работает: что, если одни из имен файлов содержали пробелы?

Если программа получает имена файлов как аргументы, не присоединяйтесь к ним с пробелами. Использовать "$@" получить доступ к ним один за другим. Хотя echo "$@" печатает споры с промежуточными пробелами, это происходит из-за echo: это печатает свои споры с пробелами как разделители. somecommand "$@" передает имена файлов как отдельные аргументы команде. Если Вы хотите распечатать аргументы на отдельных строках, можно использовать

printf '%s\n' "$@"

Если у Вас действительно есть разделенные пробелом имена файлов, и Вы хотите поместить их в массив для работы над ними, можно использовать неупомянутое переменное расширение для разделения значения в символах на IFS (необходимо будет отключить подстановочное расширение с set -f, иначе шаблоны шарика будут расширены в значении):

space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …

Можно инкапсулировать это в функции, которая восстанавливает -f установка и значение IFS когда это сделано:

split_list () {
  local IFS=' ' flags='+f'
  if [[ $- = *f* ]]; then flags=; fi
  set -f
  eval "$1=($2)"
  set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …
5
27.01.2020, 19:30
  • 1
    Изменение корректного ответа этому. Я думаю, что это более корректно к исследованию, как я добрался до разделенного пробелом списка, и получите ту информацию в другом отношении. Было бы здорово для учеников как я, если Вы комментируете немного своего snipnet, говоря нам, что делает вещи как локальный var, который делают IFS или $ условия - = f. Такие вещи, которые несколько раз, не делает человек, что использование колотит, знают. –  laconbass 12.12.2014, 00:01
  • 2
    @laconbass я добавил короткое объяснение. Искать set -f и IFS в руководстве удара, если Вы хотите все подробности. См. также unix.stackexchange.com/questions/16192 / … –  Gilles 'SO- stop being evil' 12.12.2014, 00:26
  • 3
    @Guilles, Что короткое объяснение достаточно для меня, и я думаю, что это будет для многих других. Ty в течение Вашего времени –  laconbass 12.12.2014, 04:31
  • 4
    IFS локально не вступает в силу –  Eliran Malka 21.04.2017, 02:35
  • 5
    @EliranMalka я понятия не имею, что Вы подразумеваете под этим. Если сценарий не ведет себя способ, которым Вы думаете, что он должен, можно задать вопрос здесь. –  Gilles 'SO- stop being evil' 21.04.2017, 11:32

Будьте прагматически настроены, используйте sed!!

sed 's/\s\+/\n/g' file

Вышеупомянутое говорит для замены одним или несколькими пробельными символами (\s +) с новой строкой (\n)

Это более или менее:

'substitute /one space or more/ for /newline/ globally'
4
27.01.2020, 19:30
  • 1
    изменяется с заменой, это - то, что на самом деле обозначает s! –  Rob 17.12.2013, 18:37
  • 2
    @Rob спасибо, помните, что можно отредактировать ответы других. –  MGP 17.12.2013, 18:42
  • 3
    Если у Вас будет несколько пробелов между текстом затем, то Вы получите пустые строки. Необходимо добавить '+' после \s, чтобы указать, что Вы хотите соответствовать по крайней мере одним пробелам, как соединено точно к одному пространству. т.е. sed 's/\s +/\n/g' –  DarkHeart 17.12.2013, 22:43

Вот то, как я сделал это:

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g

Заметьте использование клавиши Enter после обратной косой черты в sed команда.

0
27.01.2020, 19:30
  • 1
    , что имеют порно и недостатки sed tr? –  laconbass 17.12.2013, 17:33
  • 2
    Ваш уровень комфорта :-) Я думаю, что можно сделать больше с sed поскольку это - редактор, а не просто переведите символы. –  unxnut 17.12.2013, 17:38
  • 3
    sed может сделать настолько больше, но полностью излишество для этого. tr правильный инструмент для ЭТОГО задания, но знание sed и regexes, конечно, пригодится позже! –  Rob 17.12.2013, 17:44

Другой подход, принимая строку находится в названной переменной line:

for path in $line;do echo $path;done

Это использует то, что Bash разделяет свои аргументы на пробеле по умолчанию и что echo добавляет новую строку к ее входу по умолчанию.

0
27.01.2020, 19:30
  • 1
    я попробовал это в своей системе человечности, прежде чем я отправил этот вопрос и не мог заставить его работать. –  laconbass 17.12.2013, 18:38

Следующий скрипт прост в понимании и использовании.

cat filename | tr ' ' '\n' | tee filename
-1
27.01.2020, 19:30

В качестве альтернативы trот @laconbass вы также можете использовать xargsв этом случае:

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4  /path/to/file5"\
| xargs -n1

Преимущество в том, что он работает даже с несколькими пробелами, что trнет.

6
27.01.2020, 19:30
echo word1 word2 ... | sed -e 'y/ /\n/;P;D'

— это еще один способ превратить слова, разделенные одинарным пробелом, в слова, разделенные новой строкой.

0
27.01.2020, 19:30

Теги

Похожие вопросы