【问题标题】:Modifying the a specific string using sed in a file在文件中使用 sed 修改特定字符串
【发布时间】:2016-09-09 11:13:03
【问题描述】:

我有一个名为 /etc/pam.d/system-auth 的文件,当前内容是这样的。

[root@localhost ~]# 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
[root@localhost ~]#

我需要用这个字符串修改这一行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 命令,但它确实给了我替换的字符串。

[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 ~]#

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

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    使用这个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/'
    

    【讨论】:

      【解决方案2】:

      你的正则表达式完全错误, 例如这里两个词之间的\(\)是废话: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 而不是创建两个组。但我缺少 '+' 的转义字符,即 '\+' 。
      【解决方案3】:

      避免在 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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多