Unix команда для экранирования пробелов
Я новичок в shell script. Может кто-нибудь помочь мне с командой, чтобы избежать пространства с "\ ".
У меня есть переменная FILE_PATH= / path/к моему / текстовому файлу ,
Я хочу сбежать из этих пространств в одиночку.
FILE_PATH= / path / to\ my / text\ file
Я пробовал с командой tr-s, но это не помогает
ПУТЬ_К_ФАЙЛУ=echo FILE_PATH | tr -s " " "\\ "
Может ли кто-нибудь предложить правильную команду !!




Ответы - Unix команда для экранирования пробелов / Unix command to escape spaces

09.10.2012 11:28:37
Существует больше, чтобы сделать строку безопасной, чем просто избежать пробелов, но вы можете избежать пробелов с помощью:
FILE_PATH=$( echo "$FILE_PATH" | sed 's/ /\\ /g' )

[ ] ( ) { } ; ' " [:space:] &
а также непечатаемые символы. У тебя есть что-нибудь еще на уме?


09.10.2012 11:28:52
Вы можете сделать это с sed
:
NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\ /g')"

FILE_PATH=$(echo $FILE_PATH | sed "s/ /\\\ /g")
вам нужно три обратных косых черты, потому что вы должны экранировать символ обратной косой черты как в оболочке, так и в sed.

09.10.2012 11:29:25
FILE_PATH=/path/to my/text file
FILE_PATH=echo FILE_PATH | tr -s " " "\\ "
Эта вторая линия должна быть
FILE_PATH=echo $FILE_PATH | tr -s " " "\\ "
но я не думаю, что это имеет значение. Как только вы достигли этой стадии, вы слишком опоздали. Переменная была установлена, и либо пробелы экранированы, либо переменная неверна.
FILE_PATH= '/ путь/к моему / текстовому файлу'



tr
не может быть использован для этого.

10.10.2012 06:14:54
Если вы используете bash, вы можете использовать встроенный форматер printf %q (введите help printf
в bash):
FILENAME=$(printf %q "$FILENAME")
Это будет не только цитировать пробел, но и все специальные символы для shell.


10.10.2012 06:37:52
Вы можете использовать "одинарные кавычки" для работы с путями, содержащими пробелы:
cp '/path/with spaces/file.txt' '/another/spacey path/dir'
grep foo '/my/super spacey/path with spaces/folder/*'
в скрипте:
#!/bin/bash
spacey_dir='My Documents'
spacey_file='Hello World.txt'
mkdir '$spacey_dir'
touch '${spacey_dir}/${spacey_file}'

!
который Баш попытается интерполировать внутри двойных кавычек, но не одиночных. Конечно, вы можете бросить чуму на любого, кто вставляет символы bang в имена файлов.


20.01.2020 01:56:42
Не забывайте использовать eval при использовании printf guarding.
Вот пример из сценария Codegen в разделе этапы сборки Xcode (каким-то образом PROJECT_DIR не защищен пробелами, поэтому сборка не удалась, если у вас есть путь с пробелами):
PROJECT_DIR_GUARDED=$(printf %q "$PROJECT_DIR")
eval $PROJECT_DIR_GUARDED/scripts/code_gen.sh $PROJECT_DIR_GUARDED