在具有变量扩展的文件路径字符串中,将空格替换为“\”

7

我知道有更好的方法。

  1. 什么是更好的方法?

  2. 如何在bash中用字符串替换来操作字符串变量?

例如:(使用php因为这是我所知道的)

$path = "path/to/directory/foo bar";

$path = str_replace(" ", "\ ", "$path");

echo $path;

返回值:

path/to/directory/foo\ bar

3
你能否直接引用路径? - n0rd
1
一旦你完成替换操作,你打算对这个字符串做什么?你只需要转义空格字符还是所有的空白字符都需要转义? - augurar
你确定需要替换空格吗?如果只是将路径赋值给一个变量,path="/path/to/directory/foo bar"是可以的,只要您在使用它时始终引用$path - chepner
1
无论如何,您应该始终引用bash变量 - ghoti
2个回答

16

bash 中执行特定的替换操作:

path='path/to/directory/foo bar'
echo "${path// /\\ }"
  • bash 中给变量赋值时,不要使用前缀 $
  • = 周围不允许有空格。
  • 请注意,path 是用单引号分配的,而字符串替换发生在双引号中 - 这种区别很重要: bash 不解释单引号字符串,而您可以在双引号字符串中引用变量(和做其他事情); (还有一些其他后果,通常是不希望的 - 通常,请双引号引用您的变量引用

字符串替换的说明 "${path// /\\ }"

  • 为了对变量执行值替换,您需要在 {...} 中包含变量名
  • // 指定要替换所有出现的搜索模式(使用 / 仅替换第一个出现)。
  • / 将搜索模式 (一个空格)与替换字符串 \\  分开。
  • 替换字符串 必须表示为 \\ ,因为 \ 具有转义字符的特殊含义,因此必须为字面使用进行转义。

上述是 bash(有点晦涩)称为 shell 参数扩展,也称为 参数扩展[参数和] 变量扩展 的实例。 还有许多其他类型,例如提取子字符串、提供默认值、删除前缀或后缀等 - 请参见BashGuide页面手册上的主题。

至于在搜索和替换字符串中支持的表达式类型

  • 搜索表达式是一种与文件名扩展相同类型的通配符模式(例如*.txt)。例如,v='亲爱的我'; echo "${v/m*/你}"将产生'亲爱的你'。请注意,将使用最长匹配。
    • 此外,在此上下文中,模式的第一个字符具有特殊含义:
      • /,如上所述,导致替换所有匹配的模式-默认情况下,仅替换第一个模式。
      • #使其余模式仅在输入变量的开头匹配
      • %仅在结尾处匹配
  • 替换表达式是一个字符串,受到shell扩展的影响;虽然没有支持反向引用,但由于该字符串被扩展,因此允许您将替换字符串引用其他变量,包含命令,使用$(...)等等;例如:
    • v='甜蜜的家'; echo "${v/home/$HOME}"将产生'甜蜜的/home/jdoe'
    • v='现在是%T'; echo "${v/\%T/$(date +%T)}"将产生现在是10:05:17
    • o1=1 o2=3 v="$o1 + $o2 equals result"; echo "${v/result/$(( $o1 + $o2 ))}"将产生'1+3等于4'(我想)

还有许多其他功能和细微差别-请参阅上面的链接。


“高级Bash脚本指南”中的第10.1章“字符串操作”也有良好的解释和许多示例:https://www.tldp.org/LDP/abs/html/string-manipulation.html - botkop
1
@botkop:谢谢,我已经在答案中添加了一个链接到相关的BashGuide页面,因为它的呈现方式似乎更好;总体而言,BashGuide似乎比高级Bash脚本指南更受推崇。 - mklement0

4
如何使用sed?这是你需要的吗?点击此处了解更多信息。
#!/bin/bash

path="path/to/directory/foo bar"
new_path=$(echo "$path" | sed 's/ /\\ /g')
echo "New Path: '$new_path"

但是正如@n0rd在他的评论中指出的那样,当你想要使用路径时,最好只引用路径;像这样...

path="path/to/directory/foo bar"
echo "test" > "$path"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接