我需要在包含特定变量名的文件中找到一行。可以注释此变量,也可以不注释。如果未发表评论,那么我需要发表评论。之后添加两行。第一行以注释开始,说明为什么要添加新行,然后再添加具有附加值的变量的新行。我正在使用ubuntu 14.04.01 x64,它具有版本(GNU sed)4.2.2和GNU Awk 4.0.1。我也想使用脚本前面定义的变量。因此,命令需要接受对这些变量的引用。也不要将结果输出到控制台。一些例子是:
情况1
#ssh_param /path/to/file
结果
#ssh_param /path/to/file
#New path defined
ssh_param /etc/ssh/file
情况二
ssh_param /path/to/file
结果
#ssh_param /path/to/file
#New path defined
ssh_param /etc/ssh/file
情况3
#ssh_param
结果
#ssh_param
#New path defined
ssh_param /etc/ssh/file
案例4
#ssh_param dasfda
ssh_param /path/to/file
结果
#ssh_param dasfda
#ssh_param /path/to/file
#New path defined
ssh_param /etc/ssh/file
您想使用“脚本前面定义的变量”。以下是变量:
file="path/to/input/file"
var="ssh_param"
msg="#New path defined"
new="/etc/ssh/file"
以下是使用这些变量的命令:
lineno=$(grep -n "$var" "$file" | tail -n1 | sed 's/:.*//')
if [ "$lineno" ]
then
sed -i -r "$lineno s|#?(.*)|#\1\n$msg\n$var $new|" "$file"
else
sed -i -r "$ s|$|\n$msg\n$var $new|" "$file"
fi
笔记:
从您的示例中可以看出,变量名可能在脚本中多次出现,但只有最后一个未注释。我们在这里使用它来简化代码。脚本中变量最后一次出现的行号可从以下位置找到:
lineno=$(grep -n "$var" "$file" | tail -n1 | sed 's/:.*//')
该grep -n
部分查找在其上出现变量名称的行号列表。tail -n1
仅返回最后一行。该sed
命令从输出中删除除行号以外的所有行。
替换是通过以下命令完成的:
sed -i -r "$lineno s|#?(.*)|#\1\n$msg\n$var $new|" "$file"`
这利用了sed在特定行号上进行操作的能力。该行由三行替代:第一行是现有行的副本但有注释,第二行是消息,第三行是变量的新定义。
如果该变量当前不在文件中,lineno
则为空。在这种情况下,我们要在文件末尾添加新行。这是通过类似但更简单的sed
命令完成的:
sed -i -r "$ s|$|\n$msg\n$var $new|" "$file"
第一个$
告诉sed
只在最后一行进行操作。第二个$
出现在替代命令中,表示该行的末尾。您的消息和新的变量定义将被追加。
以此作为输入:
#ssh_param dasfda
ssh_param /path/to/file
上面的代码将文件替换为:
#ssh_param dasfda
#ssh_param /path/to/file
#New path defined
ssh_param /etc/ssh/file
(如果您希望用空行将内容隔开,只需\n
在sed
输出表达式中添加一些即可。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句