使用模式替换来替换波浪线

使用模式替换来替换波浪线

通常我使用bash 中的构造来替换字符。${parameter/pattern/string}

例如,用 替换中的${i//(/_}所有(字符。举例来说:_$i

find . -depth -type d -name '*(*' -execdir bash -c 'for i; do mv "$i" "${i//(/_}"; done' _ {} +

我无法让它与 一起工作~。  即使它包含波浪符号,${i//~/_}也会产生 的值 ,保持不变。$i

这很奇怪——除了问号,它与我使用的所有其他符号都兼容。您对波浪符号有什么想法吗?

答案1

重击(1)没有清楚地记录这样一个事实:当你这样做时

${范围/图案/细绳}
patternstring会受到命令行中适用于普通(未加引号)单词的所有扩展的影响。请考虑以下示例:

$ balance=credit

$ fire=red

$ sky=blue

$ echo "${balance/$fire/$sky}"
cblueit

当然,你的问题是它~扩展到你的主目录:

$ i=foo/home/JandPbar

$ echo "${i/~/_}"
foo_bar

因此,正如评论中所建议的,您需要用~"${i/'~'/_}"来引用/转义"${i/\~/_}"

相关内容