sed开关注释



我在文件中有以下内容

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

我需要注释第一个,并取消注释第二个"username"one_answers"database"。我试着用sed替换它们,然后添加,但没有成功。

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

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

使用GNU awk作为match()和";就地";编辑:

$ awk -i inplace '
match($0,/(.*)(47username47[[: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'
);

这里,它是作为一个外壳函数请求:

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'
);

使用awk可能要容易得多,因为sed无法计数。使用awk,您可以执行以下操作:

awk '$1~/username/{if (seen++) sub("^//",""); else sub(/^/,"//") }1' file

上面,awk使用单个规则并检查第一个字段中是否存在"username"。如果是,则检查变量seen是否已设置,(意味着"username"已被看到(如果已被看到,则使用sub删除前导"//"。如果这是第一次看到"username"(else部分(,则在该行的开头添加"//"。末尾的'1'只是打印每条记录的简写。

示例使用/输出

如果您在file中输入,您将得到:

$ awk '$1~/username/{if (seen++) sub("^//",""); else sub(/^/,"//") }1' file
//'username' => 'one',
'username' => 'two',

如果您还有其他问题,请告诉我。

每次编辑更新

在注释和代码开头之间加上空格,字段编号就会发生变化。您仍然可以使用awk处理此问题,但您需要键入完整的记录,而不仅仅是第一个字段,例如

awk '$0~"47username47"{if (seen++) sub("// ",""); else sub(/^[[:blank:]]*/,"    // ") }1' file

示例使用/输出

$ awk '$0~"47username47"{if (seen++) sub("// ",""); else sub(/^[[:blank:]]*/,"    // ") }1' file
$db['db'] = array(
'dsn'   => '',
'hostname' => 'localhost',
// 'username' => 'root',
'username' => 'user',
'password' => 'removed',
'database' => 'db'
);

更新以更好地区分"'username'"

如果您仍在寻找sed选项,这里有一个。

$cat test.seds#^'u\(.*\(一个#//'u\一个#s两个#$cat test.txt'username'=>'one',//'username'=>'two',$sed-i-f test.sed test.txt$cat test.txt//'username'=>'one','username'=>'two',

如果ed可用/可接受。

#!/usr/bin/env sh
ed -s file.txt <<-'EOF'
g|^([[:blank:]]*)('username' => 'root',)$|s||1// 2|
+1s|^([^/]*) // ('username' => 'user',)$|1 2|
g|^([[:blank:]]*)('database' => 'one')$|s||1// 2|
+1s|^([^/]*) // ('database' => 'two')$|1 2|
,p
Q
EOF

  • 移除,p以使stdout的输出静音

  • 如果需要就地编辑,请将Q更改为w

最新更新