Bash - 查找并替换同一文件中的新行

时间:2014-09-20 19:01:52

标签: bash awk sed

我需要在包含特定变量名的文件中找到一行。可以对此变量进行评论。如果没有评论,那么我需要评论它。之后添加两行。第一行首先评论为什么添加新行然后是带有附加值的变量的新行。我使用的是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

2 个答案:

答案 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。)