Bash字符串替换" "用" \"用于文件路径 - 可变扩展

时间:2014-04-08 23:41:35

标签: bash replace expansion

我知道有更好的方法可以做到这一点。

  1. 更好的方法是什么?

  2. 如何在bash中对字符串变量进行字符串替换?

  3. 例如:(使用php,因为那是我所知道的)

    $path = "path/to/directory/foo bar";
    
    $path = str_replace(" ", "\ ", "$path");
    
    echo $path;
    

    返回:

    path/to/directory/foo\ bar
    

2 个答案:

答案 0 :(得分:12)

bash中执行特定替换:

path='path/to/directory/foo bar'
echo "${path// /\\ }"
  • 分配给$中的变量时,请不要使用前缀bash
  • =周围不允许有空格。
  • 请注意,path分配了单个引号,而字符串替换则出现在 double 引号中 - 这种区别非常重要:bash不解释单引号字符串,而你可以在双引号字符串中引用变量(和做其他事情); (另外,根本没有引用变量引用有其他后果,通常是不受欢迎的 - 通常,双引用您的变量引用

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

  • 为了对变量执行值替换,首先将变量名称括在{...}
  • //指定要替换所有出现的以下搜索模式(使用/仅替换第一个事件)。
  • /将搜索模式(单个空格)与替换字符串\\ 分开。
  • 替换字符串必须表示为\\ ,因为\具有特殊含义作为转义字符。因此,必须将其自身转义以供字面使用。

以上是bash(有点隐蔽)调用 shell参数扩展以及参数扩展 [参数和]变量扩展。还有更多风味,例如提取子字符串,提供默认值,删除前缀或后缀,...... - 请参阅the BashGuide page on the topic或{ {3}}

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

  • 搜索表达式是文件名扩展中使用的相同类型的通配模式(例如,*.txt);例如,v='dear me'; echo "${v/m*/you}"会产生'dear you'。请注意,将使用最长匹配。
    • 此外,模式的第一个字符在此上下文中具有特殊含义:
      • /,正如我们上面所见,会导致所有匹配的匹配事件被替换 - 默认情况下,只有第一个被替换。
      • #导致模式的其余部分仅匹配输入变量的开头
      • %仅匹配 end
  • 替换表达是一个字符串受shell扩展 ;虽然没有支持反向引用,但扩展字符串的事实允许您让替换字符串引用其他变量,包含命令,$(...),...;例如。:
      例如,
    • v='sweet home'; echo "${v/home/$HOME}"会产生'sweet /home/jdoe'
    • 例如,
    • v='It is now %T'; echo "${v/\%T/$(date +%T)}"会产生It is now 10:05:17
    • o1=1 o2=3 v="$o1 + $o2 equals result"; echo "${v/result/$(( $o1 + $o2 ))}"收益'1 + 3 equals 4'(我认为)

还有更多功能和细微之处 - 请参阅上面的链接。

答案 1 :(得分:3)

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"