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

时间:2016-05-13 09:55:45

标签: bash sed

我有一个名为/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')
}]

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

3 个答案:

答案 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

正则表达式也因其需要做的事而过于复杂。 例如,您只需要一个组,从passwordtype=之前, 不需要介于两者之间的所有小团体。

最后,这是一个小问题,但可能你想用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'