我需要在包含特定变量名的文件中找到一行。可以对此变量进行评论。如果没有评论,那么我需要评论它。之后添加两行。第一行首先评论为什么添加新行然后是带有附加值的变量的新行。我使用的是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
案例2
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
答案 0 :(得分:0)
你可以使用这个awk:
awk 'index($0, "ssh_param /path/to/file"){if (substr($0, 1, 1) != "#") $0 = "#" $0;
$0=$0 "\n\n#New path defined\nssh_param /etc/ssh/file"} 1' file
更改文件内容:
awk 'index($0, "ssh_param /path/to/file"){if (substr($0, 1, 1) != "#") $0 = "#" $0;
$0=$0 "\n\n#New path defined\nssh_param /etc/ssh/file"} 1' file > file.tmp
mv file.tmp > file
答案 1 :(得分:0)
您想使用前面脚本中定义的"变量。"以下是变量:
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
。)