0

我正在编写一个 shell 脚本,它将查找并替换一行以禁用 nscd 中的密码缓存。问题是,在参数之前和参数之间有大量空白,我似乎无法以我对正则表达式的有限知识找到一种方法来忽略空格并将“否”更改为“是”。

这是配置文件中显示的行。以防它不能正确显示,enable-cache 之前有 8 个空格,no 之后有 12 个空格,no 之前有 10 个空格。

    enable-cache            passwd          no

我基本上只需要将该行的 no 更改为 yes。有人有什么想法吗?

谢谢

格雷格

4

2 回答 2

1

显示一个完整的使用示例(尽管在命令行而不是文件中给出了输入):

$ sed -r -e \
     's/^([[:space:]]*enable-cache[[:space:]]+passwd[[:space:]]+)no([[:space:]]*)$/\1yes\2/' \
     <input-file >output-file \
     && mv output-file input-file

要就地执行此操作,您需要使用edor ex(与 POSIX 不同sed -i,两者都是 POSIX 指定的工具):

$ printf '%s\n' \
     '%s/\([[:space:]]*enable-cache[[:space:]]\+passwd[[:space:]]\+\)no[[:space:]]*/\1yes/' \
     'wq' \
    | ex file-to-modify -s -
于 2013-05-21T23:30:04.887 回答
0

匹配并捕获从 开始 到 的部分enable-cacheno也匹配no。用捕获的部分替换所有匹配的部分,并且yes

sed 's/\(enable-cache[ ]*passwd[ ]*\)no/\1yes/' input
于 2013-05-21T23:58:12.633 回答