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

用户名

我需要在包含特定变量名的文件中找到一行。可以注释此变量,也可以不注释。如果未发表评论,那么我需要发表评论。之后添加两行。第一行以注释开始,说明为什么要添加新行,然后再添加具有附加值的变量的新行。我正在使用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
约翰1024

您想使用“脚本前面定义的变量”。以下是变量:

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

(如果您希望用空行将内容隔开,只需\nsed输出表达式中添加一些即可。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

读写同一文件bash / unix

如何从bash中的不同输出保存在同一文件的两列中

一个bash脚本,用于连接字符串并使用bash脚本在同一文件中编辑一行

Bash-如何从一个文件中查找行作为另一文件中的行的一部分?

BASH:将多个bash后台进程写入同一文件是否安全?

Bash Shell重定向标准输出和错误到同一文件中的事件顺序

重复创建指向同一文件bash的文件描述符

bash“ command1 ||回声失败”写入同一文件

.bash_profile函数在同一文件目录上运行操作

如何将0/1编码值与同一文件中提供的键匹配,并以bash格式重写为一行(而不是列表)

如何编写动态bash脚本以打印行和列数据并更新同一文件中的相同数据?

使用bash将一个文件中的行剪切为另一文件中明确指出的长度

如何使用sed通过行号将同一文件中的第N行替换为第M行

一个bash脚本,用于将文件夹的所有文件复制到Desktop中的唯一文件夹

如何根据行的第一个单词替换同一文件中的多个模式?

Notepad ++正则表达式替换为来自同一文件的捕获

查找文件的一行,提取其中的一部分并替换在 Bash 中的同一位置

查找并替换为Bash

搜索并替换同一文件中的字符串,并计算替换的数字

Bash查找并替换为C ++文件

将值替换并存储在同一文件中,shell

AWK 在同一文件的两列中查找公共数据

Shell bash将一行中的标签替换为来自其他文件的值

用用户输入的每一行替换文件中的某些字段,并保存在同一文件中

调用同一文件中的测试功能

在同一文件中声明委托协议

将值存储在同一文件中

从同一文件中绘制多个系列

从同一文件中调用PHP函数