Sed 更改ASCII文件中精确滚动的精确单词
我需要更改文件中的字符串,该字符串在每一行上重复,但我只需要更改几行(不是所有行)。 例如,/etc/fstab文件: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
/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