如何使用正确的变量进行查找和替换?
How do use correct variable for find and replace?
我想在文件中复制 Wprdpress 数据库名称和用户名,因为我有错误代码。
newdbname=${UN:0:8}"_wpdb"
newdbuser=${UN:0:8}"_wpuser"
DB_NAME=`cat wp-config.php | grep DB_NAME | cut -d \' -f 4`
DB_USER=`cat wp-config.php | grep DB_USER | cut -d \' -f 4`
sed -i "s/$DB_NAME/$newdbname/g" "$file"
sed -i "s/$DB_USER/$newdbuser/g" "$file"
但是这里发生的是,如果数据库名称和用户名相同,在这种情况下 sed 使用用户名作为数据库名称,我得到这样的输出
define( 'DB_NAME', 'domain_wpuserdb' );
define( 'DB_USER', 'domain_wpuserdb' );
预期结果
define( 'DB_NAME', 'domain_wpdb' );
define( 'DB_USER', 'domain_wpuser' );
我也试过 sed 和 perl
perl -i -pe "s/$DB_NAME/$newdbname/g" "$file"
perl -i -pe "s/$DB_USER/$newdbuser/g" "$file"
但我得到了相同的结果。我应该做哪些更改来纠正这个问题?
您可以在 sed
命令之前使用地址前缀来匹配要操作的特定行。所以你只需要替换DB_NAME
行的数据库名,替换DB_USER
行的用户名。
也不需要两个 sed
命令,您可以使用多个 -e
选项在一个命令中执行多个操作。
sed -i -e "/DB_NAME/s/'$DB_NAME'/'$newdbname'/" -e "/DB_USER/s/'$DB_USER'/'$newdbuser'/" "$file"
以下演示代码演示了实现预期结果的多种方法之一
use strict;
use warnings;
use feature 'say';
my $db_name = 'domain_wpdb';
my $db_user = 'domain_wpuser';
while( <DATA> ) {
if( /^define\( 'DB_NAME'\, / ) {
say "define( 'DB_NAME', '$db_name' );"
} elsif( /^define\( 'DB_USER', / ) {
say "define( 'DB_USER', '$db_user' );"
} else {
print;
}
}
exit 0;
__DATA__
Some text to be re-printed
define( 'DB_NAME', 'domain_wpuserdb' );
define( 'DB_USER', 'domain_wpuserdb' );
Some text to be re-printed
输出
Some text to be re-printed
define( 'DB_NAME', 'domain_wpdb' );
define( 'DB_USER', 'domain_wpuser' );
Some text to be re-printed
将代码更改为 while( <> ) {
和 运行 为 script.pl wp-config.php > temp-config.php
,然后检查在 temp-config.php
中实现的预期结果并在成功时替换 wp-config.php
文件。
要匹配要执行的特定行,请像在 sed 命令之前一样将地址添加为前缀您也不需要使用两个 Sed commands
相反,您可以像这样使用
sed -i "/DB_NAME/s/\"$DB_NAME\"/\"$newdbname\"/;/DB_USER/s/\"$DB_USER\"/\"$newdbuser\"/" "$file"
我想在文件中复制 Wprdpress 数据库名称和用户名,因为我有错误代码。
newdbname=${UN:0:8}"_wpdb"
newdbuser=${UN:0:8}"_wpuser"
DB_NAME=`cat wp-config.php | grep DB_NAME | cut -d \' -f 4`
DB_USER=`cat wp-config.php | grep DB_USER | cut -d \' -f 4`
sed -i "s/$DB_NAME/$newdbname/g" "$file"
sed -i "s/$DB_USER/$newdbuser/g" "$file"
但是这里发生的是,如果数据库名称和用户名相同,在这种情况下 sed 使用用户名作为数据库名称,我得到这样的输出
define( 'DB_NAME', 'domain_wpuserdb' );
define( 'DB_USER', 'domain_wpuserdb' );
预期结果
define( 'DB_NAME', 'domain_wpdb' );
define( 'DB_USER', 'domain_wpuser' );
我也试过 sed 和 perl
perl -i -pe "s/$DB_NAME/$newdbname/g" "$file"
perl -i -pe "s/$DB_USER/$newdbuser/g" "$file"
但我得到了相同的结果。我应该做哪些更改来纠正这个问题?
您可以在 sed
命令之前使用地址前缀来匹配要操作的特定行。所以你只需要替换DB_NAME
行的数据库名,替换DB_USER
行的用户名。
也不需要两个 sed
命令,您可以使用多个 -e
选项在一个命令中执行多个操作。
sed -i -e "/DB_NAME/s/'$DB_NAME'/'$newdbname'/" -e "/DB_USER/s/'$DB_USER'/'$newdbuser'/" "$file"
以下演示代码演示了实现预期结果的多种方法之一
use strict;
use warnings;
use feature 'say';
my $db_name = 'domain_wpdb';
my $db_user = 'domain_wpuser';
while( <DATA> ) {
if( /^define\( 'DB_NAME'\, / ) {
say "define( 'DB_NAME', '$db_name' );"
} elsif( /^define\( 'DB_USER', / ) {
say "define( 'DB_USER', '$db_user' );"
} else {
print;
}
}
exit 0;
__DATA__
Some text to be re-printed
define( 'DB_NAME', 'domain_wpuserdb' );
define( 'DB_USER', 'domain_wpuserdb' );
Some text to be re-printed
输出
Some text to be re-printed
define( 'DB_NAME', 'domain_wpdb' );
define( 'DB_USER', 'domain_wpuser' );
Some text to be re-printed
将代码更改为 while( <> ) {
和 运行 为 script.pl wp-config.php > temp-config.php
,然后检查在 temp-config.php
中实现的预期结果并在成功时替换 wp-config.php
文件。
要匹配要执行的特定行,请像在 sed 命令之前一样将地址添加为前缀您也不需要使用两个 Sed commands
相反,您可以像这样使用
sed -i "/DB_NAME/s/\"$DB_NAME\"/\"$newdbname\"/;/DB_USER/s/\"$DB_USER\"/\"$newdbuser\"/" "$file"