sed错误:替换表达式中的错误选项

时间:2014-04-03 14:29:13

标签: regex bash sed

我尝试在简单的密码文件中替换密码。新密码是垃圾密码,随机生成。

例如,这里是一个带有root帐户的影子文件。

root:igXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+udyyyyyyyyyyyySgY=:10933:0:99999:7:::

我有以下表达式,其中4个尝试中的3个。

在第四次尝试时,我收到此错误" sed:替换表达式中的错误选项"。

另一次,它运作得很好。密码将替换为随机生成的字符串。

sed -i "/root/ s/ *:[^:]*:/:"$(openssl rand -base64 32)":/ " shadow

有人可以帮忙解释一下这个问题吗?

谢谢, 泰

2 个答案:

答案 0 :(得分:2)

您生成的密码可能包含对sed表达式具有魔力的字符。稍微好一些的方法是:

$ password=$(openssl rand -base64 32)
$ awk -F: -v OFS=: -v p="$password" '$1=="root"{$2=p}1' /etc/shadow

由于大多数awk实现没有就地功能,您需要写入临时文件并替换/etc/shadow(但这可能更安全)或使用方便的{{3} }实用程序是moreutils的一部分。

答案 1 :(得分:1)

使用其他控制字符,因为/也可能出现在密码字段中。

sed -i "/root/s^A *:[^:]*:^A:"$(openssl rand -base64 32)":^A" shadow

这里的分隔符是^Actrl-A - 使用 ctrl V A 键一起输入)