输入文件:
auth sufficient pam_unix.so nullok try_first_pass abcderf
虽然,正则表达式似乎是正确的并且可以正常工作,但sed命令不会替换匹配的行:
正则表达式已成功尝试:
$ grep -E '[[:space:]]*auth[[:space:]]+sufficient[[:space:]]+pam_unix.+$' input
auth sufficient pam_unix.so nullok try_first_pass abcderf
$ grep -E '^\s*auth\s+sufficient\s+pam_unix\.so.*$' input
auth sufficient pam_unix.so nullok try_first_pass abcderf
$ grep -E "^\s*auth\s+sufficient\s+pam_unix\.so.*$" input
auth sufficient pam_unix.so nullok try_first_pass abcderf
但是,使用上述正则表达式的sed命令不会使用P
变量内容替换匹配的行:
$ P='auth sufficient pam_unix.so nullok try_first_pass'
$ echo "$P"
auth sufficient pam_unix.so nullok try_first_pass
$ sed "0,/^\s*auth\s+sufficient\s+pam_unix\.so.*$/s//${P}/" input|grep -E '^\s*auth\s+sufficient\s+pam_unix\.so.*$'
auth sufficient pam_unix.so nullok try_first_pass abcderf
$ sed "0,/^[[:space:]]*auth[[:space:]]+sufficient[[:space:]]+pam_unix.*$/s//${P}/" input|grep -E '^\s*auth\s+sufficient\s+pam_unix\.so.*$'
auth sufficient pam_unix.so nullok try_first_pass abcderf
在基本的正则表达式+
中+
。要匹配基本正则表达式中的一个或多个字符,你必须\+
。
sed "0,/^[[:space:]]*auth[[:space:]]\+sufficient[[:space:]]\+pam_unix.*$/s//${P}/"
# I would keep it in ' quotes
sed '0,/^[[:space:]]*auth[[:space:]]\+sufficient[[:space:]]\+pam_unix.*$/s//'"${P}"'/'
但是,你还是可以使用sedsed -r
或sed -E
与s一起使用扩展正则表达式,因为你似乎\s
仍然使用扩展名。