如何使用正确的变量进行查找和替换?

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"