仅在一行中更改/替换两种不同的模式

时间:2014-11-11 20:32:39

标签: bash sed substitution

我尝试从文件中更改一行中的两个不同模式。

该文件是/ etc / fstab,如:

/dev/sda1        /               ext4    auto,acl,errors=remount-ro  0       1
/dev/sda2        /home           ext4    auto,acl,errors=remount-ro  0       2

结果必须是:

/dev/sda1        /               ext4    auto,acl,errors=remount-ro  0       1
/dev/mapper/home /home           ext4    auto,acl,errors=remount-ro  0       0

我在第一个模式上做了什么:

sed -i "s/sda2/mapper\/home/" /etc/fstab

我试过的第二种模式:

sed -i "s/sda2/mapper\/home/;s/[0-9]$/0/" /etc/fstab

但它会更新所有行:

/dev/sda1        /               ext4    auto,acl,errors=remount-ro  0       0
/dev/mapper/home /home           ext4    auto,acl,errors=remount-ro  0       0

任何人都可以帮助我吗? 非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以使用语法address function-list将一组命令应用于与模式匹配的行:

sed -i "/sda2/{ s/sda2/mapper\/home/
                s/[0-9]$/0/ }" /etc/fstab

答案 1 :(得分:1)

您可以使用awk

awk '$1 ~ /sda2/{sub(/sda2/, "mapper/home", $1); $NF=0} 1' file | column -t
/dev/sda1         /      ext4  auto,acl,errors=remount-ro  0  1
/dev/mapper/home  /home  ext4  auto,acl,errors=remount-ro  0  0

使用column -t仅用于格式化。