【发布时间】:2014-05-24 08:10:33
【问题描述】:
我希望能够在一个目录中减去“.git”目录的所有文件的文件内容和文件名中用另一个字符串替换出现的一个字符串。我有以下代码,这对于更改文件名很有用,但不会替换文件中的字符串。我做错了什么?
#!/bin/bash
# Replace occurances in files, lowercase
lower1=$(echo $1 | tr '[:upper:]' '[:lower:]')
lower2=$(echo $2 | tr '[:upper:]' '[:lower:]')
echo "Replacing $lower1 with $lower2..."
find . -type f \! -iregex '.\|./.git' -exec perl -i -pe 's/$lower1/$lower2/g' {} \;
# Replace all other occurances in files to capitalised
upper2=$(echo ${2:0:1} | tr '[:lower:]' '[:upper:]')${2:1}
echo "Replacing all $1 with $upper2..."
find . -type f \! -iregex '.\|./.git' -exec perl -i -pe 's/$1/$upper2/gi' {} \;
# Replace filenames. Use "bash -c" to pass files as arguments to mv command.
# This worked
find . -name "*$lower1*" -exec bash -c 'mv "$1" "${1/$2/$3}"' -- {} $lower1 $lower2 \;
我确实尝试过 sed,但这不允许不区分大小写。
我正在 OSX Mountain Lion 上对此进行测试,如果这会有所不同,但我确实希望它也可以在 Linux 上运行。我现在不在我的 Linux 机器上。
【问题讨论】:
-
sed确实使用/i标志不区分大小写。 -
显然不在 OSX 上。 i 标志不可移植。
-
这里由于单引号,shell变量不会被插值:
's/$lower1/$lower2/g' -
是的,谢谢 bobbogo。我现在用双引号测试它。