在文件中使用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/'
你的正则表达式是完全错误的, 例如这里的\(\)
两者之间的话是无稽之谈:password\(\)requisite
正则表达式对于它需要做的事情也过于复杂。 例如,您只需要一个组,从password
到type=
, 之间不需要中间的所有小组。
最后,这是次要的事情,但可能希望将password
与^
作为独立字符(不要修改)可能在文件中注释掉的类似行。
更正和简化:
sed 's/^\(password\s\+requisite\s\+pam_cracklib.so.\+\) type=/\1 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/'
谢谢!很不错。我也尝试制作一组,从密码到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'
非常感谢我学到了+和?也需要逃脱。 – kvivek