我知道有更好的方法可以做到这一点。
还有什么更好的方法?
如何在bash中的字符串变量上替换字符串?
例如:(使用php,因为这就是我所知道的)
$path = "path/to/directory/foo bar";
$path = str_replace(" ", "\ ", "$path");
echo $path;
返回:
path/to/directory/foo\ bar
要在bash
中执行特定的替换:
path='path/to/directory/foo bar'
echo "${path// /\\ }"
$
中的变量分配时,请勿使用前缀bash
。=
周围不允许有空格。path
分配有单引号引号,而字符串替换发生在double引号中-这种区别很重要:bash
不会解释单引号的字符串,而您可以引用用双引号引起来的变量(以及其他事情); (同样,根本不引用变量引用会带来其他后果,通常是不希望的-通常,双引号引用变量引用)]字符串替换说明 "${path// /\\ }"
:
{...}
中//
指定将替换所有出现的以下搜索模式(仅使用/
替换first出现)。/
将搜索模式
(单个空格)与替换字符串\\
分开。\
必须表示为\\
,因为\
作为转义字符具有特殊含义。因此必须将其本身转义以进行字面使用。以上是bash(有点神秘地)称为shell参数扩展以及参数扩展和[参数和]变量扩展的实例。有许多其他口味,例如提取子字符串,提供默认值,去除前缀或后缀,...-参见the BashGuide page on the topic或the manual。
关于什么搜索和替换字符串中支持的表达式类型:
*.txt
);例如,v='dear me'; echo "${v/m*/you}"
产生'dear you'
。请注意,将使用longest匹配项。/
导致all匹配的模式出现被替换-默认情况下,仅替换first一个。#
使模式的其余部分仅匹配输入变量的beginning%
仅在end$(...)
等包含命令。例如。: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'
(我认为)