当正则表达式中包含感叹号时,sed命令行为异常

时间:2019-05-16 02:22:59

标签: regex sed

我要执行此任务,必须从/ etc / shadow中提取用户名和哈希密码,但是用sed命令替换流时遇到了问题。

我已经尝试过以下命令:

sed '/s/*/NoPassword/; s/!/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

在替换“!”时效果很好使用LockedPasswords,但某些用户使用“ !!”在字段中而不是“!”,因此我尝试了其他命令。

这些完全没有结果,包含一个或多个问号的密码字段保持不变

sed '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

sed '/s/*/NoPassword/; s/!{1,2}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

似乎是什么问题?我只是linux和regex的初学者。

3 个答案:

答案 0 :(得分:4)

使用awk时,您永远不需要sed。您的整个命令行可以是:

awk -F':' '{sub(/\*/,"NoPassword"); sub(/!+/,"LockedPassword"); print $1, $2}' /etc/shadow > passwords.txt

答案 1 :(得分:1)

+{ }都需要在Sed中转义。因此,在解决此问题后,您的两种尝试都应该起作用:

sed '/s/*/NoPassword/; s/!\+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

sed '/s/*/NoPassword/; s/!\{1,2\}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

答案 2 :(得分:0)

使用-E标志:

sed -E '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt