Пробелы в командной строке Bash
Если аргумент какой-либо команды содержит пробелы (или знаки табуляции) то Bash интерпретирует их как множественные аргументы. Вот, например, команда echo:
$ echo Аргумент содержит пробелы Аргумент содержит пробелы
Но ошибкой будет считать, что команда такая «умная», что в точности воспроизводит введенный текст. Это не так:
$ echo Аргумент содержит пробелы Аргумент содержит пробелы
На самом деле команда интерпретирует любое количество пробелов (и знаков табуляции) как один пробел; а пробел как разделитель между аргументами. Так как по умолчанию команда echo печатает стандартный вывод в одну строку, то и результат будет одинаковым с любым количеством пробелов.
Другие команды по умолчанию печатают свой вывод обработки каждого аргумента с новой строки, например команда printf:
$ printf '%s\n' Аргумент содержит пробелы Аргумент содержит пробелы
Тут уж сразу видно, что команда обрабатывала не фразу, а каждое слово как отдельный аргумент.
Как же заставить команду включить пробелы (и знаки табуляции) в свой стандартный вывод? Тут возможны два пути:
1. Маскировка при помощи обратного слэша (\). По-английски называется Escaping, а управляющие символы, начинающиеся с обратного слэша, Escapе-символами (само слово «escapе» переводится как исчезать, скрываться). Вот пример маскировки пробела:
$ echo Аргумент\ \ \ \ содержит\ \ \ \ пробелы Аргумент содержит пробелы $ printf '%s\n' Аргумент\ \ \ содержит\ \ \ пробелы Аргумент содержит пробелы
Механизм такой маскировки прост: при помощи специального символа, обратного слэша, мы лишили пробела его значения как разделителя между аргументами, и теперь он интерпретируется Bash только как часть текста.
2. Закавычивание. Если заключить аргумент в кавычки, двойные или одинарные, то он всегда будет интерпретирован в качестве единого выражения. Например:
$ echo 'Кавычки спасают пробелы' Кавычки спасают пробелы
Такой же механизм работает и с командами, принимающими имена файлов в качестве аргумента. Имена файлов ведь тоже могут содержать пробелы; для примера создадим файл по имени text file и попытаемся просмотреть его при помощи команды cat:
$ cat text file cat: text: Нет такого файла или каталога cat: file: Нет такого файла или каталога
$ cat text\ file You read text file
$ cat 'text file' You read text file
А интересно, справится ли с этой задачей автозавершение?
$ cat te (TAB) -----> $ cat text\ file
Автозавершение выбрало вариант маскировки. Это не удивительно, ведь маскировать приходится не только пробелы, но и управляющие символы, с которыми кавычки не справятся.
Пока мы рассматривали только пробелы внутри аргумента команды. Лишние же пробелы перед командой, между командой и опциями, между опцией и аргументом, как правило, игноририруются. Если только иное поведение специально не оговорено в синтаксисе команды.
$ cat -b text\ file 1 2 You read text file
И, наконец, пробел, поставленный вместо аргумента многих команд, заставляет их принимать стандартный ввод. Например:
$ cat -b (Enter) Тут и сказке (Enter) конец. (Enter)(CTRL+d) 1 Тут и сказке 2 конец.
Пробелы в пути файлов командной строки Windows, как их использовать?

Оболочки командной строки, такие как командная строка Windows и PowerShell, используют пробелы для разделения команд и аргументов, но имена файлов и папок также могут содержать пробелы поэтому просто так их использовать пробелы нельзя. Давайте разберемся…
Почему стоит избегать использование пробелов при работе в коммандной строке
Пробел в пути папки или файла командная строка определяет как разделение команд и аргументов. Для того, чтобы использовать пробел как собственно пробел, прийдется весь пусть экранировать, а это требует отдельного внимания в зависимости от конкретной оболочки командной строки и программы, выполняемой в этой оболочке.
Кратко опишем проблему: например, у нас есть текстовый файл, который необходимо прочесть. Предположим этот файл расположен по адресу C:\Temp\TestFile.txt Для его прочтения необходимо выполнить команду
type C:\Temp\TestFile.txt
Отлично, а теперь представим, что прочесть теперь необходимо файл по адресу C:\Temp Folder\Test File.txt
Выполнив команду ниже вы со 100% вероятностью получите не вывод содержимого файла на экран, а ошибку — пробелы в пути файла не дадут команде выполниться корректно.
type C:\Temp Folder\Test File.txt

Три способа использовать знак пробела в пути Windows
Существует три способа использовать пробел в пути файлов:
- Заключить путь c пробелами в двойные кавычки ( » )
- Добавлять символ каре ( ^ ) перед каждый пробелом (работает только в командной строке CMD и только в определенных командах и программах)
- Добавлять знак ударения ( ` ) перед каждым пробелом (работает только в PowerShell, но работает всегда)
Рассмотрим каждый способ ближе.
Заключить путь в двойные кавычки
Стандартный метод точного указания пути к файлу в Windows — заключение его в двойные кавычки. Например, команда выдававшая ошибку в примере выше с кавычками в пути будет выглядеть так:
type "C:\Temp Folder\Test File.txt"
Так же, вы можете заключить лишь часть пути в двойные кавычки, например только ту часть, которая содержит в себе пробелы.
Интересно: Как настроить AES шифрование military-grade в Windows 11
Представим, что в папке Temp Folder у нас находится файл TestFile.txt, в таком случае команда будет выглядеть так:
type "C:\Temp Folder"\TestFile.txt
Но, на практике такие кавычки использовать не лучшая мысль — это запутывает код и делает его менее гибким. Гораздо проще просто закрыть весь путь двойными кавычками.
Это решение работает как в традиционной среде командной строки (CMD), так и в Windows PowerShell.

Добавить символ каре с пробелами в командной строке
Теоретически символ каре в командной строке позволит вам пользоваться пробелами в пути файлов. Нужно просто добавлять символ перед каждым пробелом (Shift + 6 в английской раскладке).
На практике этот спецсимвол работает не каждый раз и очень часто программа завершается ошибкой.
Например, следующая команда должна выполниться без проблем, но она почему-то выдает ошибку
type C:\Temp^ Folder\Test^ File.txt

С другой стороны, если мы попробуем окрыть наш файл напрямую, введя его путь в командной строке и проставив символы каре, то увидим, что пробелы в пути файла обработались корректно:
C:\Temp^ Folder\Test^ File.txt

Таким образом, по своему опыту и поискав информацию в интернете мы приходим к выводу, что этот способ работает только с избранными программами и не дает полной уверенности в результате.
Вывод — пользуйтесь двойными кавычками в командной строке, или символом ударения в PowerShell, о котором ниже.
PowerShell символ ударения с пробелами в командной строке
PowerShell использует символ ударения в качестве экранирующего символа. Его нужно добавлять с каждым пробелом в имени файла (Этот символ спрятан на букве Ё на клавиатуре).
type C:\Temp` Folder\Test` File.txt
Каждый символ ударения указывает PowerShell как обрабатывать каждый последующий пробел.
Обратите внимание, что этот способ работает только в среде PowerShell, в командной строке придется использовать символ каретки, или, как уже писали выше, экранировать весь путь двойными кавычками.

Для пользователей UNIX-подобных систем напомним, что аналогичная проблема с пробелами в командной строке в Linux и MacOS решается использованием символа обратной косой черты ( \ ).
Как поставить пробел в командной строке
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Сообщения: 27449
Благодарности: 8086
Предпочтительнее использовать PowerShell, указывая кодировку входного и выходного файлов.
Сообщения: 63
Благодарности: 0
а если у меня файл (5гб) больше чем оперативки на компе (4гб) будет ли он выполнять задачу с подстановкой символов?
Сообщения: 27449
Благодарности: 8086
Что-то более опытные коллеги молчат…
vision-d, выполнять задачу будет (разве что Вы принудительно отключили файл подкачки). Другое дело, что при таком объёме надо смотреть на конкретные командлеты. Например, код из ##5, 7 и 10, как я понимаю, считывают файл целиком в память. Более щадящим будет использование построчного чтения из одного файла, поиск/замена в строке и запись её в другой файл.
Сообщения: 63
Благодарности: 0
Цитата Foreigner:
| $a = gc file.txt $a | % < "'/rsl.pdf';" -f [int]$_ > $a | % < "'/rsl@';" -f [int]$_ > » |
Можно ли сделать тут чтобы он строки не переносил на отдельные строки, а записывал бы их сплошным текстом?
Сообщения: 1748
Благодарности: 963
vision-d:
| чтобы он строки не переносил на отдельные строки, а записывал бы их сплошным текстом? |
$a = gc file.txt ( $a | % < "'/rsl.pdf'" -f [int]$_ > ) -join ';' ( $a | % < "'/rsl@'" -f [int]$_ > ) -join ';'
Последний раз редактировалось Foreigner, 15-01-2014 в 20:10 .
Как поставить пробел в командной строке
Из программы обращаюсь к командной строке, и в общении возможны пробелы в пути файлов, чем заменить эти пробелы чтобы командная строка их приняла? Пробовал %20, не прокатило.
| Crystallon |
| Посмотреть профиль |
| Найти ещё сообщения от Crystallon |
Trust no one.
Регистрация: 07.04.2009
Сообщений: 6,526
Пути в двойные кавычки.
cd "D:/Documents and settings"
SQUARY PROJECT — НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK — УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
| Alex Cones |
| Посмотреть профиль |
| Найти ещё сообщения от Alex Cones |
Форумчанин
Регистрация: 05.04.2010
Сообщений: 273
Сообщение от Alex Cones
Пути в двойные кавычки.
cd "D:/Documents and settings"
Благодарю(кинул спасибку на профиль).
| Crystallon |
| Посмотреть профиль |
| Найти ещё сообщения от Crystallon |
Пользователь
Регистрация: 04.01.2011
Сообщений: 66
я использовал %backspace%
| alexusankov |
| Посмотреть профиль |
| Найти ещё сообщения от alexusankov |
| Похожие темы | ||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Командная строка | RgnRok | Общие вопросы C/C++ | 10 | 25.01.2011 18:42 |
| Командная строка | Morphling | Помощь студентам | 9 | 01.02.2010 00:27 |
| Командная строка | Vladya | Помощь студентам | 4 | 09.02.2009 18:29 |
| Командная строка | Dj_smart | Свободное общение | 2 | 23.08.2008 20:12 |
| командная строка | Mails | Помощь студентам | 2 | 12.05.2008 18:29 |