我希望自动更改SQL转储(无需知道原始数据库名称)-因此,如果SQL转储说,例如...
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */;
我希望它自动扫描文件中的所有CREATE DATABASE
行,并追加mysql
以显示为prefix_mysql
对于文件中的所有CREATE DATABASE
记录-这可能吗?-我可以在这里找到数据库名称,但不知道如何将它们联系在一起
find . -name \*.sql -type f -exec bash -c '
echo "found $# sql dumps"
for file; do
dbnames=( $(grep -Poe "CREATE DATABASE [^\`]*\`\K[^\`]*" "$file") )
printf "\n file: %s\n" "$file"
printf "%2s database(s): %s\n" "${#dbnames[*]}" "${dbnames[*]}"
done
> ' 'find-sh' {} +
也尝试过
read -p "enter the cPanel username: " cpuser
cd "/home/$cpuser/public_html"
dbnames=($(grep $sqldump -Poe "CREATE DATABASE [^\`]*\`\K[^\`]*"))
for i in ${dbnames[@]}; do sed -i "s/$i/$cpuser_$i" $sqldump; done
无论我得到什么;
sed: -e expression #1, char 11: unterminated `s' command
sed: -e expression #1, char 13: unterminated `s' command
sed: -e expression #1, char 13: unterminated `s' command
1条答案
按热度按时间t30tvxxf1#
让
sed
在替换时搜索模式本身,而不是使用grep
来查找它。你的代码不仅替换
CREATE DATABASE
行,它还替换所有出现的数据库名称,这意味着如果数据库名称出现在列名、转储值等中,它们将得到添加的前缀。另外,如果你想在
${cpuser}
后面放一个字面值_
,你需要使用带大括号的${cpuser}
,否则它会查找一个名为cpuser_
的变量。