如何使用Shell脚本替换文本文件中的特定行?

3

我正在尝试使用Shell脚本替换txt文件中的特定行,例如:

cat aa.txt:
auditd=0
bladeServerSlot=0

当我运行脚本时,我想将"bladeServerSlot"更改为12,如下所示:
cat aa.txt:
auditd=0
bladeServerSlot=12

你能帮我一下吗?


perl -ne '$_ =~ s/bladeServerSlot=0/bladeServerSlot=12/; print $_;' aa.txt - AbhiNickz
1
这段代码可以用更好的方式书写,即使用 perl -pe 's/bladeServerSlot=0/bladeServerSlot=12/' aa.txt - Sobrique
3个回答

3
使用sed和反向引用:
sed -r '/bladeServerSlot/ s/(^.*)(=.*)/\1=12/g' inputfile

使用 awk 命令,可以搜索包含 bladeServerSlot 的行,并替换该行的第二列。
awk  'BEGIN{FS=OFS="="}/bladeServerSlot/{$2=12}1' inputfile

谁曾经给我点了踩,请有点礼貌并解释一下为什么要这样做。 - P....
1
似乎使用sed更干净,如/^bladeServerSlot/s/=.*$/=12/ - William Pursell
sed '/^bladeServerSlot/s/=.*$/=12/g' aa.txt > output.txt - WeiHua Liu

2
perl -pe 's/bladeServerSlot=\K\d+/12/' aa.txt  > output.txt
\K正向后行断言的一种特殊形式,它会丢弃所有先前的匹配。因此,我们只需要替换后面的内容。默认情况下,s/应用于$_,它包含当前行。-p会打印出每一行的$_,所以其他所有行都会被复制。我们将输出重定向到一个文件中。

-1

你真的需要替换示例中的那行吗?由于 bladeServerSlot 是一个变量,你可以重置其值。

bladeServerSlot=`any command`

或者你可以让这个变量由提供给此脚本的参数填充。

bladeServerSlot=$1

使用$1作为脚本的第一个参数。我认为这是比在此处使用复杂的正则表达式更清晰解决问题的方法。sed/perl的解决方案可以工作,但对于阅读你的脚本的其他人来说并不太清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接