我有一个名为/etc/pam.d/system-auth的文件,目前的内容是这样的。
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
[root@localhost ~]# 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
[root@localhost ~]#
。
我使用了以下sed命令,但它确实给了我替换字符串。
loaders: [{
test: /\.jsx?$/,
loaders: ['babel?retainLines=true'],
include: path.join(__dirname, 'src')
}]
我无法理解我哪里出错了?
答案 0 :(得分:2)
使用此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/'
答案 1 :(得分: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/'
答案 2 :(得分:0)
避免使用/ in 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'