用符合两个条件的行replace一个单词

我试图用defaults defaults,nodevreplacedefaults defaults,nodev//home/opt/tmp/var

但是,对于swapproc defaults设置不应该改变。

这是/etc/fstab文件:

 /dev/rootvg/swap swap swap defaults 0 0 /dev/rootvg/sysroot / ext3 defaults 1 1 /dev/sda1 /boot ext3 acl,user_xattr 1 2 /dev/rootvg/home /home ext3 defaults 1 2 /dev/rootvg/opt /opt ext3 defaults 1 2 /dev/rootvg/tmp /tmp ext3 defaults 1 2 /dev/rootvg/var /var ext3 defaults 1 2 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 

我希望这个sed命令对你有帮助

 sed '/proc\|swap/!s/defaults/&,nodev/' /etc/fstab 

输出:

 /dev/rootvg/swap swap swap defaults 0 0 /dev/rootvg/sysroot / ext3 defaults,nodev 1 1 /dev/sda1 /boot ext3 acl,user_xattr 1 2 /dev/rootvg/home /home ext3 defaults,nodev 1 2 /dev/rootvg/opt /opt ext3 defaults,nodev 1 2 /dev/rootvg/tmp /tmp ext3 defaults,nodev 1 2 /dev/rootvg/var /var ext3 defaults,nodev 1 2 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 

注意:如果你想在文件中使用-i选项进行更改

你可以使用{来组合两个正则表达式地址:

 /^\//{/swap/!s/defaults/defaults,nodev/} 

更详细地说:

 #!/bin/sed /^\//{ /swap/!s/defaults/defaults,nodev/ } 

所以在以/开头的行上,如果那行不包含swap ,那就进行替换。

实际上,对于那个特定的文件,所有的磁盘文件系统都是ext3 ,所以你可以简化为

 /ext3/s/defaults/defaults,nodev/ 

看来你想改变所有的ext3文件系统的选项。 然后你可以:

 sed '/ext[2-4]/s/defaults/&,nodev/' file 

用这一行,它将在ext2, 3, 4上应用替代。 你可以调整它,如果你想,例如ext3仅用于ext3。 但是,这可能并不总是给你正确的结果,因为正则表达式被使用。

如果你必须做某些挂载点的替换,我会使用awk检查列,我也不会使用正则表达式。