33

私はシェルスクリプトが初めてです。誰かが「\」でスペースをエスケープするコマンドを手伝ってくれませんか。変数 FILE_PATH=/path/to my/text file
があり、スペースだけをエスケープしたい FILE_PATH=/path/to\ my/text\ file

tr -s コマンドで試しましたが、役に立ちません

ファイルパス=echo FILE_PATH | tr -s " " "\\ "

誰かが正しいコマンドを提案できますか!!

4

7 に答える 7

55

bash を使用している場合は、組み込みの printf の %q フォーマッタ ( help printfbash で入力)を使用できます。

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

これは、スペースだけでなく、シェルのすべての特殊文字も引用します。

于 2012-10-10T02:14:54.433 に答える
12

文字列を安全にするには、スペースをエスケープするだけではありませんが、次の方法でスペースをエスケープできます。

FILE_PATH=$( echo "$FILE_PATH" | sed 's/ /\\ /g' )
于 2012-10-09T19:28:37.233 に答える
8

'一重引用符' を使用して、スペースを含むパスを操作できます。

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}'
于 2012-10-10T02:37:52.753 に答える
2

あなたはそれを行うことができますsed

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\\ /g')"
于 2012-10-09T19:28:52.920 に答える
1

引用符を使用して SPACE 文字を保持する

tr は、個々の文字を 1 対 1 で置き換えるためだけに使用されます。sed が必要なようです。

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

あなたが望むことをするようです。

于 2012-10-10T06:43:49.587 に答える
1

Do not forget to use eval when using printf guarding.

Here's a sample from Codegen Script under Build Phases of Xcode (somehow PROJECT_DIR is not guarded of spaces, so build was failing if you have a path with spaces):

PROJECT_DIR_GUARDED=$(printf %q "$PROJECT_DIR")
eval $PROJECT_DIR_GUARDED/scripts/code_gen.sh $PROJECT_DIR_GUARDED
于 2020-01-20T10:56:42.533 に答える
-4
FILE_PATH=/path/to my/text file
FILE_PATH=echo FILE_PATH | tr -s " " "\\ "

その2行目は

FILE_PATH=echo $FILE_PATH | tr -s " " "\\ "

しかし、それは問題ではないと思います。この段階に来てからでは手遅れです。変数が設定されていますが、スペースがエスケープされているか、変数が正しくありません。

FILE_PATH='/path/to my/text file'

于 2012-10-09T19:29:25.167 に答える