我正在编写一个shell脚本,它将查找并替换一行以禁用nscd中的密码缓存。问题是,在参数之前和之间存在大量的空白区域,我似乎无法通过我对正则表达式的有限知识找到方法来忽略空格并将no更改为yes。
这是配置文件中显示的行。为了防止它显示不正确,启用缓存前有8个空格,之后有12个空格,没有前10个空格。
enable-cache passwd no
我基本上只需要将该行的“否”更改为“是”。有人有什么想法吗?
谢谢
格雷格
答案 0 :(得分:1)
显示完整的用法示例(尽管在命令行而不是从文件中给出输入):
$ sed -r -e \
's/^([[:space:]]*enable-cache[[:space:]]+passwd[[:space:]]+)no([[:space:]]*)$/\1yes\2/' \
<input-file >output-file \
&& mv output-file input-file
要就地执行此操作,您需要使用ed
或ex
(两者,与sed -i
不同,是POSIX指定的工具):
$ printf '%s\n' \
'%s/\([[:space:]]*enable-cache[[:space:]]\+passwd[[:space:]]\+\)no[[:space:]]*/\1yes/' \
'wq' \
| ex file-to-modify -s -
答案 1 :(得分:0)
匹配并捕获从enable-cache
开始的部分,最多no
,并匹配no
。将所有匹配的零件替换为捕获的零件yes
:
sed 's/\(enable-cache[ ]*passwd[ ]*\)no/\1yes/' input