Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将配置文件中的同一个字替换为数组中的不同字_Bash_Shell_Awk_Sed - Fatal编程技术网

Bash 如何将配置文件中的同一个字替换为数组中的不同字

Bash 如何将配置文件中的同一个字替换为数组中的不同字,bash,shell,awk,sed,Bash,Shell,Awk,Sed,你好 我对Shell脚本非常陌生,所以需要您的帮助 我有下面的信息配置文件 config name AAAAA root root port number 00000 Hostname hahahahah config name AAAAA root less port number 00001 Hostname nonononono config name AAAAA root less port number

你好

我对Shell脚本非常陌生,所以需要您的帮助

我有下面的信息配置文件

config name AAAAA root root port number 00000 Hostname hahahahah config name AAAAA root less port number 00001 Hostname nonononono config name AAAAA root less port number 00002 Hostname nonononono
${array1[0]} # Has value of value11111
${array2[1]} # Has value of value22222
${array2[1]} # Has value of value33333
我想更改配置文件并另存为以下内容

config name value11111 root root port number 00000 Hostname hahahahah config name value22222 root less port number 00001 Hostname nonononono config name value33333 root less port number 00002 Hostname nonononono 配置名称值11111 根 端口号00000 哈哈哈 配置名称值22222 无根 端口号00001 主机名NONONO 配置名称值33333 无根 端口号00002 主机名NONONO 我尝试了awk和sed,但没有成功。。。。。你能帮个忙吗?

看看一些答案

我赞同Ed和David的建议(事后看来,这篇文章可能只是一个评论而不是一个答案),awk/sed可能不是这份工作的最佳工具,你应该退后一步,重新思考这个过程。有一大堆事情可能会出错;数组值可能没有正确填充,没有检查是否有足够的值用于所有替换,并且最终无法回滚更改

然而,这里有一个起点,只是为了说明一些sed。它当然不是性能最好的,并且只适用于GNU-sed,但提供了您所需的输出

#/bin/bash
声明一个数组
数组=(值11111值2222值33333)
对于“${array[@]}”中的;做
#使用sed内联,直接对文件执行替换
#从第一行开始,搜索'config name aaaaaaa'的第一个匹配项`
#然后在花括号中执行替换
sed-i“0,/config name AAAAA/{s/config name AAAAA/config name$a/}”yourinputconfigfile
完成
#您的输入配置文件
配置名称值11111
根
端口号00000
哈哈哈
配置名称值22222
无根
端口号00001
主机名NONONO
配置名称值33333
无根
端口号00002
主机名NONONO
查看一些答案

我赞同Ed和David的建议(事后看来,这篇文章可能只是一个评论而不是一个答案),awk/sed可能不是这份工作的最佳工具,你应该退后一步,重新思考这个过程。有一大堆事情可能会出错;数组值可能没有正确填充,没有检查是否有足够的值用于所有替换,并且最终无法回滚更改

然而,这里有一个起点,只是为了说明一些sed。它当然不是性能最好的,并且只适用于GNU-sed,但提供了您所需的输出

#/bin/bash
声明一个数组
数组=(值11111值2222值33333)
对于“${array[@]}”中的;做
#使用sed内联,直接对文件执行替换
#从第一行开始,搜索'config name aaaaaaa'的第一个匹配项`
#然后在花括号中执行替换
sed-i“0,/config name AAAAA/{s/config name AAAAA/config name$a/}”yourinputconfigfile
完成
#您的输入配置文件
配置名称值11111
根
端口号00000
哈哈哈
配置名称值22222
无根
端口号00001
主机名NONONO
配置名称值33333
无根
端口号00002
主机名NONONO

shell阵列是如何填充的?很可能您不需要它们,而是可以直接从它们正在填充的任何对象获取输入,因此盲目地在它们上面构建不是一个好主意。如果值总是
value11111
value2222
,等等。。您可以使用
awk
生成替换。如果它们是任意值,则需要使用脚本和参数扩展<可以使用code>awk和
sed
,但在这种情况下,您将为每个替换生成一个额外的过程。回答@edmorton的评论shell数组是如何填充的?很可能您不需要它们,而是可以直接从它们正在填充的任何对象获取输入,因此盲目地在它们上面构建不是一个好主意。如果值总是
value11111
value2222
,等等。。您可以使用
awk
生成替换。如果它们是任意值,则需要使用脚本和参数扩展<可以使用code>awk和
sed
,但在这种情况下,您将为每个替换生成一个额外的过程。请回答@EdMorton的评论