用可变扩展名的文件路径字符串中的“ \”替换“”

问题描述 投票:6回答:2

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

  1. 还有什么更好的方法?

  2. 如何在bash中的字符串变量上替换字符串?

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

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

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

echo $path;

返回:

path/to/directory/foo\ bar
bash replace expansion
2个回答
14
投票

要在bash中执行特定的替换:

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

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

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

以上是bash(有点神秘地)称为shell参数扩展以及参数扩展[参数和]变量扩展的实例。有许多其他口味,例如提取子字符串,提供默认值,去除前缀或后缀,...-参见the BashGuide page on the topicthe manual

关于什么搜索和替换字符串中支持的表达式类型

  • 搜索表达式是在文件名扩展中使用的相同类型的globbing pattern(例如*.txt);例如,v='dear me'; echo "${v/m*/you}"产生'dear you'。请注意,将使用longest匹配项。
    • 此外,该模式的first字符在这种情况下具有特殊含义:
        如上所示,
      • /导致all匹配的模式出现被替换-默认情况下,仅替换first一个。
      • #使模式的其余部分仅匹配输入变量的beginning
      • %仅在end
      • 处匹配
  • replacement expression是一个字符串,该字符串取决于shell扩展;尽管对反向引用的支持是[[no,但是扩展了字符串这一事实使您可以让替换字符串引用其他变量,并使用$(...)等包含命令。例如。:
      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'(我认为)
  • 还有更多功能和细节-请参阅上面的链接。

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

    © www.soinside.com 2019 - 2024. All rights reserved.