shell sql转储自动更改

mdfafbf1  于 2023-01-31  发布在  Shell
关注(0)|答案(1)|浏览(103)

我希望自动更改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
t30tvxxf

t30tvxxf1#

sed在替换时搜索模式本身,而不是使用grep来查找它。

find . -name '*.sql' -exec sed -i "s/\\(CREATE DATABASE [^\`]*\`\\)/\\1${cpuser}_/" {} +

你的代码不仅替换CREATE DATABASE行,它还替换所有出现的数据库名称,这意味着如果数据库名称出现在列名、转储值等中,它们将得到添加的前缀。
另外,如果你想在${cpuser}后面放一个字面值_,你需要使用带大括号的${cpuser},否则它会查找一个名为cpuser_的变量。

相关问题