Sed 更改ASCII文件中精确滚动的精确单词

Sed 更改ASCII文件中精确滚动的精确单词,sed,grep,xargs,Sed,Grep,Xargs,我需要更改文件中的字符串,该字符串在每一行上重复,但我只需要更改几行(不是所有行)。 例如,/etc/fstab文件: /dev/mapper/rhel-root / xfs defaults 0 0 /dev/mapper/rhel-boot /boot ext4 defaults 1 2 /dev/mapper/rhel-hom

我需要更改文件中的字符串,该字符串在每一行上重复,但我只需要更改几行(不是所有行)。 例如,/etc/fstab文件:

/dev/mapper/rhel-root            /                       xfs     defaults        0 0
/dev/mapper/rhel-boot            /boot                   ext4    defaults        1 2
/dev/mapper/rhel-home            /home                   ext3    defaults        1 2
/dev/mapper/rhel-var             /var                    ext3    defaults        1 2
/dev/mapper/workvg-swaplv        swap                    swap    defaults        0 0
如何将/home和/var条目的“defaults”字符串更改为“string”? 我尝试过的thinks使用了很多grep | sed | exargs等的组合,但效果并不理想:)

有人能告诉我一些关于这个的想法吗? 提前谢谢大家

$ sed -E '/\/(home|var)/ s/defaults/string/' fstab
/dev/mapper/rhel-root            /                       xfs     defaults        0 0
/dev/mapper/rhel-boot            /boot                   ext4    defaults        1 2
/dev/mapper/rhel-home            /home                   ext3    string        1 2
/dev/mapper/rhel-var             /var                    ext3    string        1 2
/dev/mapper/workvg-swaplv        swap                    swap    defaults        0 0
  • -E
    使用扩展正则表达式
  • /\/(home | var)/
    这是为了仅将那些行与
    /home
    /var
  • s/defaults/string/
    用替换字符串替换所需的模式
编辑:

要获得更可靠的匹配,请执行以下操作:

sed -E '/^\S+\s+\/(home|var)\b/ s/^((\S+\s+){3})defaults\b/\1string/' fstab
这将检查第2列中
/home
/var
的精确匹配,并替换第4列中
默认值的精确匹配

\b
检查单词边界,
\s
匹配空白,
\s
匹配除空白以外的其他内容

$ awk '/\/var/ || /\/home {sub(/defaults/, "string")} 1'` /etc/fstab
  • -E
    使用扩展正则表达式
  • /\/(home | var)/
    这是为了仅将那些行与
    /home
    /var
  • s/defaults/string/
    用替换字符串替换所需的模式
编辑:

要获得更可靠的匹配,请执行以下操作:

sed -E '/^\S+\s+\/(home|var)\b/ s/^((\S+\s+){3})defaults\b/\1string/' fstab
这将检查第2列中
/home
/var
的精确匹配,并替换第4列中
默认值的精确匹配

\b
检查单词边界,
\s
匹配空白,
\s
匹配除空白以外的其他内容

$ awk '/\/var/ || /\/home {sub(/defaults/, "string")} 1'` /etc/fstab
  • /\/var||/\/home
    如果记录中有关键字
  • sub{/defaults/,“string”)
    将第一个“defaults”替换为“string”
  • 1
    打印更改和未更改的记录
  • /\/var||/\/home
    如果记录中有关键字
  • sub{/defaults/,“string”)
    将第一个“defaults”替换为“string”
  • 1
    打印更改和未更改的记录

这将适用于所有输入行以及不包含反斜杠的
默认值
字符串
的所有值(如果有反斜杠,这是一个简单的调整):


它将GNU awk用于第三个参数to match(),其他awk将使用substr()。

这将对所有输入行以及所有不包含反斜杠的
默认值
字符串
的值有效(如果您有反斜杠,这是一个简单的调整):


它将GNU awk用于第三个参数to match(),其他awk将使用substr().

虽然这将在给定发布的示例输入的情况下生成预期输出,但在其他输入的情况下,它会有很多失败的方式,例如,如果rhel引导是主引导,或者字符串包含&或者如果映射器是默认值,或者…所以-使用它时要小心!虽然这将在给定发布的示例输入的情况下生成预期输出,但是有很多问题需要解决如果rhel引导是主引导,或者字符串包含-,或者映射器是默认值,或者…,那么在使用它时一定要小心!
awk '/home|var/{sub(/defaults/,"string  ")}1' file

/dev/mapper/rhel-root            /                       xfs     defaults        0 0
/dev/mapper/rhel-boot            /boot                   ext4    defaults        1 2
/dev/mapper/rhel-home            /home                   ext3    string          1 2
/dev/mapper/rhel-var             /var                    ext3    string          1 2
/dev/mapper/workvg-swaplv        swap                    swap    defaults        0 0