Unix команда для экранирования пробелов

Unix команда для экранирования пробелов

09.10.2012 11:25:28 Просмотров 21 Источник

Я новичок в shell script. Может кто-нибудь помочь мне с командой, чтобы избежать пространства с "\ ". У меня есть переменная FILE_PATH= / path/к моему / текстовому файлу ,
Я хочу сбежать из этих пространств в одиночку. FILE_PATH= / path / to\ my / text\ file

Я пробовал с командой tr-s, но это не помогает

ПУТЬ_К_ФАЙЛУ=echo FILE_PATH | tr -s " " "\\ "

Может ли кто-нибудь предложить правильную команду !!

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces#comment17319962_12806987
В чем заключается ваша настоящая проблема?
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces#comment17320088_12806987
Просто хочу избежать пространства, чтобы я мог использовать его в других командах, таких как cp, rm и т. д

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

William Pursell

09.10.2012 11:28:37

Существует больше, чтобы сделать строку безопасной, чем просто избежать пробелов, но вы можете избежать пробелов с помощью:

FILE_PATH=$( echo "$FILE_PATH" | sed 's/ /\\ /g' )
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807044#comment17320138_12807044
Не могли бы Вы уточнить? Я предполагаю, что вы предлагаете исключить символы, зарезервированные оболочкой, например, [ ] ( ) { } ; ' " [:space:] &а также непечатаемые символы. У тебя есть что-нибудь еще на уме?
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807044#comment17320198_12807044
@Barton это, конечно, будет зависеть от использования, но все упомянутые вами персонажи подозрительны. В основном я имею в виду, что попытка сбежать от персонажей для какой-либо защиты является хрупкой и не должна быть сделана без особой осторожности.
Gilles Quenot

09.10.2012 11:28:52

Вы можете сделать это с sed :

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\ /g')"
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807053#comment77945743_12807053
FILE_PATH=$(echo $FILE_PATH | sed "s/ /\\\ /g")вам нужно три обратных косых черты, потому что вы должны экранировать символ обратной косой черты как в оболочке, так и в sed.
hymie

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= '/ путь/к моему / текстовому файлу'

https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807068#comment17320060_12807068
FILE_PATH=echo $FILE_PATH | tr -s " " "\\ "нарушен. Необходимо $( )
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807068#comment17320206_12807068
Честно говоря-я печатал быстро - но это не было главным моментом.
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12807068#comment17320258_12807068
Кроме того, trне может быть использован для этого.
Bao Haojun

10.10.2012 06:14:54

Если вы используете bash, вы можете использовать встроенный форматер printf %q (введите help printfв bash):

FILENAME=$(printf %q "$FILENAME")

Это будет не только цитировать пробел, но и все специальные символы для shell.

https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12811033#comment81435443_12811033
Используя это, я все еще испытываю проблемы с двумя сцепленными пространствами. Что я могу сделать?
jahroy

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}'
https://stackoverflow.com/questions/12806987/unix-command-to-escape-spaces/12811189#comment17374639_12811189
Если вам не нужно делать интерполяцию переменных, я бы предложил использовать одинарные кавычки, а не двойные. Есть некоторые подлые персонажи, такие как !который Баш попытается интерполировать внутри двойных кавычек, но не одиночных. Конечно, вы можете бросить чуму на любого, кто вставляет символы bang в имена файлов.
sureshvv

10.10.2012 10:43:49

Используйте кавычки, чтобы сохранить символ пробела

tr используется только для замены отдельных символов 1 на 1. Похоже, что тебе нужен сед.

echo $FILE_PATH | sed -e 's/ /\\ /'

похоже, ты делаешь то, что хочешь.

kikiwora

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
Закрыть X