复杂的正则表达式帮助 - 在此声明中理解{}

时间:2017-06-19 18:40:22

标签: regex sed

我有正则表达式,我试图理解。我想我已经掌握了大部分内容,但我在下面{}中的位置丢失了。我想它说,如果没有匹配第一部分(在{}内)的东西,那么添加后一部分。

我试图将其分解。

egrep  "^\s*password\s+sufficient\s+pam_unix.so(\s+.*)$" /etc/pam.d/system-auth && sudo sed -ri '/^\s*password\s+sufficient\s+pam_unix.so\s+/ { /^\s*password\s+sufficient\s+pam_unix.so(\s+\S+)*(\s+remember=[0-9]+)(\s+.*)?$/! s/^(\s*password\s+sufficient\s+pam_unix.so\s+)(.*)$/\1remember=5 \2/ }' /etc/pam.d/system-auth && sudo sed -ri 's/(^\s*password\s+sufficient\s+pam_unix.so(\s+\S+)*\s+)remember=[0-9]+(\s+.*)?$/\1remember=5\3/' /etc/pam.d/system-auth

我试图将其分解如下......

if pattern ("^\s*password\s+sufficient\s+pam_unix.so(\s+.*)$")
sed '/^\s*password\s+sufficient\s+pam_unix.so\s+/ { /^\s*password\s+sufficient\s+pam_unix.so(\s+\S+)*(\s+remember=[0-9]+)(\s+.*)?$/! s/^(\s*password\s+sufficient\s+pam_unix.so\s+)(.*)$/\1remember=5 \2/ }'
if success
    sed 's/(^\s*password\s+sufficient\s+pam_unix.so(\s+\S+)*\s+)remember=[0-9]+(\s+.*)?$/\1remember=5\3/'

由于

1 个答案:

答案 0 :(得分:0)

首先,阅读sed command listoptions可能会有所帮助。特别属于s/regex/replace/[flags]{ cmd ; cmd ... }

但你基本上是正确的。使用{}的sed命令基本上是"找到类似password sufficient pam_unix.so的行,如果该行不包含remember=#,请添加remember=5" 。

最后的sed会再次查找所有这些行,并将remember=#更改为remember=5