Warm tip: This article is reproduced from serverfault.com, please click

shell-替换第一条完整的匹配行

(shell - replacing whole, first matched line)

发布于 2020-11-29 14:14:06

输入文件:

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
Questioner
Chris
Viewed
11
KamilCuk 2020-11-29 23:11:16

在基本的正则表达式++要匹配基本正则表达式中的一个或多个字符,你必须\+

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 -rsed -E与s一起使用扩展正则表达式,因为你似乎\s仍然使用扩展名。