33

我是 shell 脚本的新手。有人可以用命令帮助我用“\”转义空格吗?我有一个变量 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")

这不仅会引用空格,还会引用 shell 的所有特殊字符。

于 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

使用引号保留空格字符

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 " " "\\ "

第二行必须是

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

但我认为这不重要。一旦你到了这个阶段,你就太晚了。变量已设置,空格被转义或变量不正确。

FILE_PATH='/路径/到我的/文本文件'

于 2012-10-09T19:29:25.167 回答