在文件中使用sed修改特定字符串

问题描述:

我有一个名为/etc/pam.d/system-auth的文件,当前内容是这样的。在文件中使用sed修改特定字符串

[[email protected] ~]# cat /etc/pam.d/system-auth 
#%PAM-1.0 
# This file is auto-generated. 
# User changes will be destroyed the next time authconfig is run. 
auth  required  pam_env.so 
auth  sufficient pam_fprintd.so 
auth  sufficient pam_unix.so nullok try_first_pass 
auth  requisite  pam_succeed_if.so uid >= 500 quiet 
auth  required  pam_deny.so 

account  required  pam_unix.so 
account  sufficient pam_localuser.so 
account  sufficient pam_succeed_if.so uid < 500 quiet 
account  required  pam_permit.so 

password requisite  pam_cracklib.so try_first_pass retry=3 type= 
password sufficient pam_unix.so sha256 shadow nullok try_first_pass use_au                      thtok 
password required  pam_deny.so 

session  optional  pam_keyinit.so revoke 
session  required  pam_limits.so 
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet                       use_uid 
session  required  pam_unix.so 
[[email protected] ~]# 

我需要修改这一行password requisite pam_cracklib.so try_first_pass retry=3 type=这个字符串 password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1

我使用了下面的sed命令,但它确实给了我替换的字符串。

[[email protected] ~]# sed 's/\(\(password\(\s+)requisite\(\s+\)pam_cracklib.so\(.*?\)\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' /etc/pam.d/system-auth 
#%PAM-1.0 
# This file is auto-generated. 
# User changes will be destroyed the next time authconfig is run. 
auth  required  pam_env.so 
auth  sufficient pam_fprintd.so 
auth  sufficient pam_unix.so nullok try_first_pass 
auth  requisite  pam_succeed_if.so uid >= 500 quiet 
auth  required  pam_deny.so 

account  required  pam_unix.so 
account  sufficient pam_localuser.so 
account  sufficient pam_succeed_if.so uid < 500 quiet 
account  required  pam_permit.so 

password requisite  pam_cracklib.so try_first_pass retry=3 type= 
password sufficient pam_unix.so sha256 shadow nullok try_first_pass use_authtok 
password required  pam_deny.so 

session  optional  pam_keyinit.so revoke 
session  required  pam_limits.so 
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid 
session  required  pam_unix.so 
[[email protected] ~]# 

我无法理解我哪里出错了?

使用此sed

sed 's/\(\(password\(\s\+\)requisite\(\s\+\)pam_cracklib.so\(.*\?\)\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' file 

两个问题在您的sed

  • +? - 你逃避它得到扩展regEx行为
  • \s - 在password\(\)分组
  • 错过

sed清晰版:

sed 's/^\(\(password\s\+requisite\s\+pam_cracklib.so.*\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 

如果您sed支持-E选项,

sed -E 's/^(password\s+requisite\s+pam_cracklib.so.*)(type=)/\1 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 
+0

非常感谢我学到了+和?也需要逃脱。 – kvivek

你的正则表达式是完全错误的, 例如这里的\(\)两者之间的话是无稽之谈:password\(\)requisite

正则表达式对于它需要做的事情也过于复杂。 例如,您只需要一个组,从passwordtype=, 之间不需要中间的所有小组。

最后,这是次要的事情,但可能希望将password^作为独立字符(不要修改)可能在文件中注释掉的类似行。

更正和简化:

sed 's/^\(password\s\+requisite\s\+pam_cracklib.so.\+\) type=/\1 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 
+0

谢谢!很不错。我也尝试制作一组​​,从密码到type =之前,并使用\ 1而不是创建两个组。但我错过了'+'的转义字符,例如'\ +'。 – kvivek

避免使用/在sed,而是使用;所以它会更清洁,与-E

sed -E 's;(pam_cracklib.so\s+try_first_pass\s+)(retry=3\s+)type=;\1\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1;g'