我知道有更好的方法可以做到这一点。
更好的方法是什么?
如何在bash中对字符串变量进行字符串替换?
例如:(使用php,因为那是我所知道的)
$path = "path/to/directory/foo bar";
$path = str_replace(" ", "\ ", "$path");
echo $path;
返回:
path/to/directory/foo\ bar
答案 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 $(...)
,...;例如。:
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)