sed 开关注释

whi*_*sky 0 awk sed

我在文件中有以下内容

$db['db'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    // 'username' => 'user',
    'password' => 'removed',
    'database' => 'one'
    // 'database' => 'two'
);
Run Code Online (Sandbox Code Playgroud)

我需要注释第一个并取消注释第二个“用户名”和“数据库”。我试图通过替换然后添加没有成功来将它们与 sed 交换。

我需要将以下内容覆盖到原始文件中

$db['db'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    // 'username' => 'root',
    'username' => 'user',
    'password' => 'removed',
    // 'database' => 'one'
    'database' => 'two'
);
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 5

将 GNU awk 用于第三个 arg tomatch()和“就地”编辑:

$ awk -i inplace '
match($0,/(.*)(\047username\047[[:space:]]*=>.*)/,a) {
    $0 = ( sub("//[[:space:]]*","",a[1]) ? a[1] : a[1] "// " ) a[2]
}
1' file
Run Code Online (Sandbox Code Playgroud)

$ cat file
$db['db'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    // 'username' => 'root',
    'username' => 'user',
    'password' => 'removed',
    'database' => 'db'
);
Run Code Online (Sandbox Code Playgroud)

这是作为请求的shell函数:

swap() {
    awk -i inplace -v tgt="$1" '
        match($0,"(.*)(\047" tgt "\047[[:space:]]*=>.*)",a) {
            $0 = ( sub("//[[:space:]]*","",a[1]) ? a[1] : a[1] "// " ) a[2]
        }
    1' "$2"
}
Run Code Online (Sandbox Code Playgroud)

$ swap username file
Run Code Online (Sandbox Code Playgroud)

$ cat file
$db['db'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    // 'username' => 'root',
    'username' => 'user',
    'password' => 'removed',
    'database' => 'db'
    // 'database' => 'db'
);
Run Code Online (Sandbox Code Playgroud)

$ swap database file
Run Code Online (Sandbox Code Playgroud)

$ cat file
$db['db'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    // 'username' => 'root',
    'username' => 'user',
    'password' => 'removed',
    // 'database' => 'db'
    'database' => 'db'
);
Run Code Online (Sandbox Code Playgroud)