sed开关注释
我在文件中有以下内容
$db['db'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
// 'username' => 'user',
'password' => 'removed',
'database' => 'one'
// 'database' => 'two'
);
我需要注释第一个并取消注释第二个“用户名”和“数据库”。我试图通过替换然后添加没有成功来将它们与 sed 交换。
我需要将以下内容覆盖到原始文件中
$db['db'] = array(
'dsn' => '',
'hostname' => 'localhost',
// 'username' => 'root',
'username' => 'user',
'password' => 'removed',
// 'database' => 'one'
'database' => 'two'
);
回答
将 GNU awk 用于第三个 arg tomatch()和“就地”编辑:
$ awk -i inplace '
match($0,/(.*)( 47username 47[[:space:]]*=>.*)/,a) {
$0 = ( sub("//[[:space:]]*","",a[1]) ? a[1] : a[1] "// " ) a[2]
}
1' file
$ cat file
$db['db'] = array(
'dsn' => '',
'hostname' => 'localhost',
// 'username' => 'root',
'username' => 'user',
'password' => 'removed',
'database' => 'db'
);
这是作为请求的shell函数:
swap() {
awk -i inplace -v tgt="$1" '
match($0,"(.*)( 47" tgt " 47[[:space:]]*=>.*)",a) {
$0 = ( sub("//[[:space:]]*","",a[1]) ? a[1] : a[1] "// " ) a[2]
}
1' "$2"
}
$ swap username file
$ cat file
$db['db'] = array(
'dsn' => '',
'hostname' => 'localhost',
// 'username' => 'root',
'username' => 'user',
'password' => 'removed',
'database' => 'db'
// 'database' => 'db'
);
$ swap database file
$ cat file
$db['db'] = array(
'dsn' => '',
'hostname' => 'localhost',
// 'username' => 'root',
'username' => 'user',
'password' => 'removed',
// 'database' => 'db'
'database' => 'db'
);