【发布时间】:2019-03-14 02:53:41
【问题描述】:
我的结果变量包含以下内容:
auth required pam_faillock.so preauth silent audit deny=3 even_deny_root fail_interval=888 unlock_time=888
auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root fail_interval=888 unlock_time=888
我想替换整行,我正在使用 sed。替换似乎在第一次迭代时可以正常工作,但在第二次迭代中不行。但是,当我打印这些值时,它表明新值已正确更新。
echo "$result" |
while IFS= read -r line;
do
newValue=""
for ii in $line
do
if [[ "$ii" != *"unlock_time"* ]]; then
newValue="$newValue $ii"
fi
done
newValue="$newValue unlock_time=900"
sed -i "s/$line/$newValue/g" $password_auth
echo " Line : [ $line ]"
echo "newValue : [ $newValue ]"
done
输出显示如下:
Line : [ auth required pam_faillock.so preauth silent audit deny=3 even_deny_root fail_interval=888 unlock_time=900 ]
newValue : [ auth required pam_faillock.so preauth silent audit deny=3 even_deny_root fail_interval=888 unlock_time=900 ]
Line : [ auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root fail_interval=888 unlock_time=888 ]
newValue : [ auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root fail_interval=888 unlock_time=900 ]
在这里显示时,我看到变量中存在正确的值,并且所有打印都发生在 sed 命令之后,并且在输出打印之前我没有看到任何错误。
但是当我检查文件时,我看到 unlock_time 的第二个实例仍然是 888 而不是 900。
注意:我无法全局替换 unlock_time,这就是我将需要更新的行存储在结果中的原因。
循环中有什么被忽略的吗?
更新: 我试过在命令行上运行 sed 命令:
sed -i "s/auth required pam_faillock.so preauth silent audit deny=3 even_deny_root fail_interval=888 unlock_time=900/auth required pam_faillock.so preauth silent audit deny=3 even_deny_root fail_interval=888 unlock_time=999/g" temp <-- This works
sed -i "s/auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root fail_interval=888 unlock_time=9/auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root fail_interval=888 unlock_time=900/g" temp <-- This doesn't update file but doesn't throw an error either
当我将转义字符放在 [default=die] 周围时,该命令在命令行上起作用。但是如果我是通过脚本来做的,我该怎么做呢?
【问题讨论】:
-
如果您想在替换命令的 LHS 中匹配
[或],则必须引用它们,即[必须更改为\[或[[],以便 @ 987654331@ 不被视为bracket expression 的元字符。 -
是的,但在我的情况下,我正在从文件中读取值,所以我不会事先知道是否有括号。
-
你是用 bash 做这个吗?
-
是的,我正在通过 bash 脚本进行操作...
-
如果你想在变量中引用
[和]字符,使用 sed 创建一个新变量,例如newvar=$(<<<"$oldvar" sed 's/[].*[]/\\&/g')
标签: sed