【问题标题】:Unix command to escape spacesUnix命令转义空格
【发布时间】:2012-10-09 19:25:28
【问题描述】:

我是 shell 脚本的新手。有人可以用命令帮助我用“\”转义空格吗? 我有一个变量 FILE_PATH=/path/to my/text 文件,
我想独自逃离空间 FILE_PATH=/path/to\ my/text\ 文件

我尝试使用 tr -s 命令,但没有帮助

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

有人可以提出正确的命令吗!!

【问题讨论】:

  • 您遇到的真正问题是什么?
  • 只是想转义空间,以便我可以在其他命令中使用,例如 cp 、 rm 等
  • 如果您想在其他命令中使用 FILE_PATH,只需使用引号即可。 rm "$FILE_PATH" 如果包含空格,则可以正常工作。
  • 注意:-s 代表挤压而不是替代。将连续的空格挤成一个空格。此外,tr 仅将 1 替换为 1,而不是带有反斜杠和空格的空格。

标签: linux shell unix


【解决方案1】:

如果您使用的是 bash,则可以使用其内置 printf 的 %q 格式化程序(在 bash 中输入 help printf):

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

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

【讨论】:

  • 使用这个我仍然有两个连接空格的问题。我能做什么?
  • 这在 zsh 中似乎也可以。
【解决方案2】:

除了转义空格之外,要使字符串更安全,还可以通过以下方式转义:

FILE_PATH=$( echo "$FILE_PATH" | sed 's/ /\\ /g' )

【讨论】:

  • 您愿意详细说明吗?我猜您是在建议消除 shell 保留的字符,例如 [ ] ( ) { } ; ' " [:space:] & 以及不可打印的字符。你还有什么想法吗?
  • @Barton 这当然取决于使用情况,但你提到的所有字符都是可疑的。大多数情况下,我想到的是,为了任何形式的保护而试图转义字符都是脆弱的,不应该不加小心就应该这样做。
【解决方案3】:

您可以使用'单引号'对包含空格的路径进行操作:

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}'

【讨论】:

  • 除非您需要进行变量插值,否则我实际上建议使用单引号而不是双引号。有一些鬼鬼祟祟的字符,例如!,bash 会尝试在双引号内插入,但不是单引号。当然,您可以随意对任何在文件名中使用 bang 字符的人进行攻击。
【解决方案4】:

您可以使用sed 来做到这一点:

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\\ /g')"

【讨论】:

  • FILE_PATH=$(echo $FILE_PATH | sed "s/ /\\\ /g") 您需要三个反斜杠,因为您必须在 shell 和 sed 中转义反斜杠字符。
【解决方案5】:

使用引号保留空格字符

tr 仅用于将单个字符 1 替换为 1。似乎是您需要 sed。

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

似乎做你想做的事。

【讨论】:

    【解决方案6】:

    在使用 printf 保护时不要忘记使用 eval

    这是 Xcode 的 Build Phases 下 Codegen Script 的一个示例(不知何故 PROJECT_DIR 没有保护空格,因此如果您有带空格的路径,则构建失败):

    PROJECT_DIR_GUARDED=$(printf %q "$PROJECT_DIR")
    eval $PROJECT_DIR_GUARDED/scripts/code_gen.sh $PROJECT_DIR_GUARDED
    

    【讨论】:

      【解决方案7】:
      FILE_PATH=/path/to my/text file
      FILE_PATH=echo FILE_PATH | tr -s " " "\\ "
      

      第二行需要

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

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

      FILE_PATH='/path/到我的/文本文件'

      【讨论】:

      • FILE_PATH=echo $FILE_PATH | tr -s " " "\\ " 坏了。你需要$( )
      • 很公平——我打字很快——但这不是重点。
      • 另外,tr 不能用于此。
      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2021-07-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多